文章目录[隐藏]
asyncio 使用 logging 打log 会阻塞,有个 异步版本库 aiologger
安装
pip3 install aiologger
官网只有输出到控制台的demo,没有写入到文件的,一点都不具体,吐槽官网
通过阅读源码实现了输出到文件跟控制下面是 demo
import os
import sys
import asyncio
import datetime
from aiologger import Logger
from aiologger.utils import bind_loop
from aiologger.levels import LogLevel
from aiologger.formatters.base import Formatter
from aiologger.handlers.files import AsyncFileHandler
from aiologger.handlers.streams import AsyncStreamHandler
class AsyncLogger(object):
def __init__(self, name=None, loop=None):
day_date = datetime.datetime.now().strftime("%Y-%m-%d")
log_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'logs/', f'{day_date}/')
if not os.path.exists(log_path):
os.makedirs(log_path)
if loop is None:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
self.loop = loop
formatter = Formatter('[%(asctime)s] %(filename)s -> %(funcName)s line:%(lineno)d [%(levelname)s] %(message)s')
"""
这里直接 初始化 Logger 类,不使用 with_default_handlers
是因为源码里会 添加两次 AsyncStreamHandler,
这里直接初始化 Logger 自已构建实例
"""
logger = Logger(name=name, level=LogLevel.DEBUG)
ash = bind_loop(AsyncStreamHandler, {})(stream=sys.stderr, level=LogLevel.DEBUG, formatter=formatter)
logger.add_handler(ash)
"""
添加写入文件 AsyncFileHandler
参数里没有 formatter,只有手动修改 父类的 formatter 这个属性
"""
log_name = f'{log_path}{name + ".log"}'
afh = AsyncFileHandler(log_name, 'a', encoding='utf-8')
afh.formatter = formatter
self.logger = logger
self.logger.add_handler(afh)
def get_logger(name):
return AsyncLogger(name).logger
async def main():
logger = get_logger('test_logger')
await asyncio.gather(*[
logger.error('hello error') for i in range(100)
])
await logger.shutdown()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())