asynclog
provide the asynchronous way for python logging. Leave the logging I/O(especially the network I/O when we want to logging to a network endpoint) to the asynchronous thread or asynchronous task provided by celery .
- Python 3.5+
pip install asynclog
- Config from dict
log_cfg = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '%(asctime)s \n %(levelname)s \n %(message)s'
},
},
'handlers': {
'async_handler': {
'level': 'INFO',
'formatter': 'simple',
'class': 'asynclog.AsyncLogDispatcher',
'func': '[Dot_Path_To_Your_Func]',
}
},
'loggers': {
'asynclogger': {
'handlers': ['async_handler', ],
'level': 'DEBUG',
'propagate': False,
},
}
}
logging.config.dictConfig(log_cfg)
logger = logging.getLogger('asynclogger')
logger.info('Test asynclog')
- Using thread
import logging
import time
from asynclog import AsyncLogDispatcher
def write_log(msg):
# Do write stuff, such as write log msg into network.
# ...
time.sleep(0.5)
logger = logging.getLogger()
logger.setLevel(logging.INFO)
handler = AsyncLogDispatcher(write_log)
handler.setLevel(logging.INFO)
logger.addHandler(handler)
logger.info('Test Log')
- Using Celery
from celery import shared_task
@shared_task
def write_task(msg):
# Write log in Network IO
print(msg)
celery_handler = AsyncLogDispatcher(write_task, use_thread=False, use_celery=True)
celery_handler.setLevel(logging.INFO)
logger.addHandler(celery_handler)
logger.info('Test Log')
python3 -m unittest
......
----------------------------------------------------------------------
Ran 6 tests in 0.007s
OK