python 日志模块简单封装
2018-07-20 本文已影响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 搜集查看日志的需求。