python 日志模块简单封装

最近要部署一个 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 日志模块简单封装)