美文网首页
python 日志模块简单封装

python 日志模块简单封装

作者: 乌合中壹 | 来源:发表于2018-07-20 18:16 被阅读675次

    最近要部署一个 python 的 flask 项目, 与其它 web 工程一样, 需要一个日志记录库。 经查阅, 发现 python 自带了强悍的日志模块 logging。然后简单的实现了自己的 logger 封装。

    首先要明确下需求

    • 日志要能够以 json 格式写入文件,且日志文件能够通过文件大小或是时间截断
    • 调试过程,日志能够清晰漂亮的格式打印到控制台,即标准输出

    下面就直接看代码了

    # logger.py
    import os
    import logging
    from logging.handlers import RotatingFileHandler
    from pip._internal.utils.logging import ColorizedStreamHandler
    from pythonjsonlogger.jsonlogger import JsonFormatter
    
    if not os.path.exists('log'):
        os.mkdir('log')
    
    
    def getLogger():
        _logger = logging.getLogger('my_log')
        _logger.setLevel(logging.DEBUG)  # 坑坑! 此处要整体设置 logger level = DEBUG,否则后面在不同的 handler 中设置 level 无效
    
        # 此处通过文件大小截断日志文件,如果想要通过时间截断,可以使用 TimedRotatingFileHandler 这个类
        fileHandler = RotatingFileHandler(filename='./log/my_log.log', mode='a', maxBytes=10 * 1024 * 1024,
                                          encoding='utf8', backupCount=100)
        fileHandler.setLevel(logging.INFO)
        # 以 json 格式写入文件
        fileHandler.setFormatter(
            JsonFormatter('(name)s (asctime)s (threadName)s (levelname)s %(filename)s %(lineno)d %(message)s'))
        _logger.addHandler(fileHandler)
    
        # 不同 level, 颜色不同
        consoleHandler = ColorizedStreamHandler()
        consoleHandler.setLevel(logging.DEBUG)
        # 标准输出没必要 json 了,只打印 message 就好了
        consoleFormatter = logging.Formatter('%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s')
        consoleHandler.setFormatter(consoleFormatter)
        _logger.addHandler(consoleHandler)
    
        return _logger
    
    
    logger = getLogger()
    
    if __name__ == '__main__':
        pass
        i = 0
        while True:
            logger.debug("level debug")
            logger.info("level info")
            logger.warning('level warning')
            logger.error("level error")
            logger.critical('level critical')
    
            i += 1
            if i == 10000: break
    

    看下结果


    标准输入 文件输出

    上面的代码除了依赖 python 本身的 logging 模块,还依赖了 python-json-logger 模块,需要 pip install python-json-logger

    如果没有其它什么特殊的需求,上面的封装基本上够用了。满足本地调试或是通过 EFK 搜集查看日志的需求。

    相关文章

      网友评论

          本文标题:python 日志模块简单封装

          本文链接:https://www.haomeiwen.com/subject/bmmqmftx.html