前言
日志功能,作为软件开发必不可少。Python的日志封装网上也有不少,不乏抄来抄去。抄,可以。但必须验证才能转发。如果仅仅是复制粘贴,就没意思了,甚至误导别人。以下是2天内自己研究验证的新的,与大家共享。
实现的思路是基于logging包。
需求:
- 支持屏幕打印和文件输出
- 支持日期、时间、引用源文件名(不要求全路径)、行号,日志信息
说明:这里是最基础的要求。更高要求实现,在后续文章介绍。
实现过程
直接上代码
class Logger(object):
'''
日志封装类
使用方法:
from logger import log
log.info('hello world!')
'''
def __init__(self, log_file_path, level=logging.INFO):
'''
log_file_path 日志文件,全路径带日志文件名
level 日志级别:DEBUG INFO WARNING ERROR CRITICAL
'''
self.curlogger = logging.getLogger()
self.curlogger.setLevel(level)
# set log output format
formatter = logging.Formatter('%(asctime)s [%(levelname)s] [%(filename)s: %(lineno)d] %(message)s', '%Y-%m-%d %H:%M:%S')
# file log output setting
file_handler = logging.FileHandler(log_file_path)
file_handler.setFormatter(formatter)
file_handler.setLevel(level)
self.curlogger.addHandler(file_handler)
# console log output setting
console = logging.StreamHandler()
console.setLevel(level)
console.setFormatter(formatter)
self.curlogger.addHandler(console)
log = Logger("infer.log", logging.DEBUG).curlogger
输出测试结果:
2022-01-20 09:51:57 [INFO] [test.py: 16] info log
2022-01-20 09:51:57 [INFO] [test.py: 6] info log in function test()
2022-01-20 09:51:57 [DEBUG] [test.py: 7] debug log in function test()
2022-01-20 09:51:57 [WARNING] [test.py: 8] waring log in function test()
2022-01-20 09:51:57 [INFO] [test.py: 11] log in function of rename()
2022-01-20 09:51:57 [ERROR] [test.py: 12] runtime error: bad parameter
注意事项
网络上有的人在该封装类添加了封装函数,如下:
def debug(self, message):
"""
:param message: debug信息
:return:
"""
self.logger.debug(message)
def info(self, message):
"""
:param message: info信息
:return:
"""
self.logger.info(message)
def warn(self, message):
"""
:param warn: warn 信息
:return:
"""
self.logger.warn(message)
def error(self, message):
"""
:param message: error 信息
:return:
"""
self.logger.error(message)
这样做的后果很明显:封装的4个函数,掩盖了logging本来的接口函数,将日志调用源文件固化为logger.py,如下:
2022-01-20 09:34:50 [inference] [INFO] [logger.py: 16 ] info log
2022-01-20 09:34:50 [inference] [INFO] [logger.py: 6 ] info log in function test()
2022-01-20 09:34:50 [inference] [DEBUG] [logger.py: 7 ] debug log in function test()
2022-01-20 09:34:50 [inference] [WARNING] [logger.py:8 ] waring log in function test()
2022-01-20 09:34:50 [inference] [INFO] [logger.py: 11 ] log in function of rename()
2022-01-20 09:34:50 [inference] [ERROR] [logger.py: 12 ] runtime error: bad parameter
这样行号和源文件对应不起来。所以文章不要盲目的抄,你验证下,才是抄会了,对吧。