一、问题场景
需求:使用Python内置的Logging模块记录日志,将每天的日志单独写入一个文件中,文件命名规则为“固定前缀+日期”。
问题:为了将每天的日志单独写入一个文件,程序每天会重复运行一次配置Handler的代码。但是每过一天,Handler输出的信息就会重复增加一次。效果如下所示:
2023-10-01 09:00:00.00000 - DEBUG - 第一天的日志
2023-10-02 09:00:00.00000 - DEBUG - 第二天的日志
2023-10-02 09:00:00.00000 - DEBUG - 第二天的日志
2023-10-03 09:00:00.00000 - DEBUG - 第三天的日志
2023-10-03 09:00:00.00000 - DEBUG - 第三天的日志
2023-10-03 09:00:00.00000 - DEBUG - 第三天的日志
二、原因及解决方法
原先的代码片段如下:
1 2 3 4 5 6 7 8 9 10
| logger = logging.getLogger('my_logger')
info_handler = logging.FileHandler(r'D:\output\日志-%s.txt'%(date), delay=True) info_handler.set_name('handler_name_info') info_handler.setLevel(logging.DEBUG) info_handler.setFormatter(logging.Formatter('%(key_time)s - %(levelname)s - %(message)s')) info_handler.close() logger.addHandler(info_handler)
|
经过一番研究,阿猪终于发现了问题所在。原来是每次运行addHandler()
时,都会在相应的Logger中添加一个同样类型的Handler,而不是覆盖先前的Handler。
阿猪这里有两个解决方法:
1、先删除原先的Handler,然后再重新添加
代码片段示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| logger = logging.getLogger('my_logger')
for handler in logger.handlers[:]: logger.removeHandler(handler)
info_handler = logging.FileHandler(r'D:\output\日志-%s.txt'%(date), delay=True) info_handler.set_name('handler_name_info') info_handler.setLevel(logging.DEBUG) info_handler.setFormatter(logging.Formatter('%(key_time)s - %(levelname)s - %(message)s')) info_handler.close() logger.addHandler(info_handler)
|
2、仅覆盖配置信息,不重复添加Handler
代码片段示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| logger = logging.getLogger('my_logger') bool_if_first = False
info_handler = logging.FileHandler(r'D:\output\日志-%s.txt'%(date), delay=True) info_handler.set_name('handler_name_info') info_handler.setLevel(logging.DEBUG) info_handler.setFormatter(logging.Formatter('%(key_time)s - %(levelname)s - %(message)s')) info_handler.close()
if not bool_if_first: logger.addHandler(info_handler) bool_if_first = True
|
版权声明: 未经书面授权许可,任何个人和组织不得以任何形式转载、引用本站的任何内容。本站保留追究侵权者法律责任的权利。