python asyncio 异步 aiologger 使用

文章目录[隐藏]

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())
暂无评论
本文作者:
本文链接: https://www.qinless.com/?p=231
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 qinless 的博客!
100

发表评论

返回顶部