87 lines
2.0 KiB
Python
87 lines
2.0 KiB
Python
'''
|
|
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()
|