Example logging X-Request-Id transparently
This commit is contained in:
parent
5011bfef55
commit
0a72168f8f
86
examples/log_request_id.py
Normal file
86
examples/log_request_id.py
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
'''
|
||||||
|
Based on example from https://github.com/Skyscanner/aiotask-context
|
||||||
|
and `examples/{override_logging,run_async}.py`.
|
||||||
|
|
||||||
|
Needs https://github.com/Skyscanner/aiotask-context/tree/52efbc21e2e1def2d52abb9a8e951f3ce5e6f690 or newer
|
||||||
|
|
||||||
|
$ pip install git+https://github.com/Skyscanner/aiotask-context.git
|
||||||
|
'''
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import uuid
|
||||||
|
import logging
|
||||||
|
from signal import signal, SIGINT
|
||||||
|
|
||||||
|
from sanic import Sanic
|
||||||
|
from sanic import response
|
||||||
|
|
||||||
|
import uvloop
|
||||||
|
import aiotask_context as context
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class RequestIdFilter(logging.Filter):
|
||||||
|
def filter(self, record):
|
||||||
|
record.request_id = context.get('X-Request-ID')
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
LOG_SETTINGS = {
|
||||||
|
'version': 1,
|
||||||
|
'disable_existing_loggers': False,
|
||||||
|
'handlers': {
|
||||||
|
'console': {
|
||||||
|
'class': 'logging.StreamHandler',
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'formatter': 'default',
|
||||||
|
'filters': ['requestid'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'filters': {
|
||||||
|
'requestid': {
|
||||||
|
'()': RequestIdFilter,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'formatters': {
|
||||||
|
'default': {
|
||||||
|
'format': '%(asctime)s %(levelname)s %(name)s:%(lineno)d %(request_id)s | %(message)s',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'handlers': ['console'],
|
||||||
|
'propagate': True
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
app = Sanic(__name__, log_config=LOG_SETTINGS)
|
||||||
|
|
||||||
|
|
||||||
|
@app.middleware('request')
|
||||||
|
async def set_request_id(request):
|
||||||
|
request_id = request.headers.get('X-Request-ID') or str(uuid.uuid4())
|
||||||
|
context.set("X-Request-ID", request_id)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
async def test(request):
|
||||||
|
log.debug('X-Request-ID: %s', context.get('X-Request-ID'))
|
||||||
|
log.info('Hello from test!')
|
||||||
|
return response.json({"test": True})
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
asyncio.set_event_loop(uvloop.new_event_loop())
|
||||||
|
server = app.create_server(host="0.0.0.0", port=8000)
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
loop.set_task_factory(context.task_factory)
|
||||||
|
task = asyncio.ensure_future(server)
|
||||||
|
try:
|
||||||
|
loop.run_forever()
|
||||||
|
except:
|
||||||
|
loop.stop()
|
Loading…
Reference in New Issue
Block a user