如何修正Python跨类调用Logger时的文件名/函数名日志显示异常
日志文件名与函数名记录问题排查
我使用一个内部日志库运行服务,该库提供标准日志和Debug日志两种功能。我希望日志中同时记录文件名和函数名,因库未提供该功能,我修改了Formatter,但效果不符合预期。以下是最小可复现示例、当前输出及预期输出:
one.py
import logging from logging import handlers import datetime as dt import time class myFormatter(logging.Formatter): converter=dt.datetime.fromtimestamp def formatTime(self, record, datefmt=None): ct = self.converter(record.created) if datefmt: s = ct.strftime(datefmt) else: t = ct.strftime("%Y-%m-%d %H:%M:%S") z = time.strftime("%z") s = "%s.%03d %s" % (t, record.msecs, z) return s class Logger: @staticmethod def get(name): logger = logging.getLogger("example") handler = handlers.RotatingFileHandler("example.log", mode='a', maxBytes=10485760) formatter = myFormatter('%(asctime)s %(levelname)s: %(message)s') handler.setLevel(logging.DEBUG) handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) return logger
two.py
from one import Logger from three import DebugLog class Component(object): def __init__(self, name): self.name = name logname = name logger = Logger.get(logname) self.logger = logger self.debug = DebugLog(self)
three.py
class DebugLog: def __init__(self,component): self._component = component def _debug(self, msg, *args, **kwargs): self._component.logger.debug(msg, *args, **kwargs) def debug(self, msg, *args, **kwargs): self._debug(msg, *args, **kwargs)
main.py
from two import Component from one import myFormatter component = Component('myexample') # 这是我的修改 DEBUG_LOG_FORMAT = myFormatter('%(asctime)s %(levelname)s: [%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s') component.debug._component.logger.handlers[0].formatter = DEBUG_LOG_FORMAT def component_log(): component.logger.info("I log this in component log") def component_debug_log(): component.debug.debug("I log this in component debug log") component_log() component_debug_log()
当前输出
➜ M-WR4R2NYKL6 ~/logging-bug python main.py ➜ M-WR4R2NYKL6 ~/logging-bug cat example.log 2023-11-03 10:45:16.450 +0530 INFO: [main.py:14 - component_log() ] I log this in component log 2023-11-03 10:45:16.450 +0530 DEBUG: [three.py:8 - _debug() ] I log this in component debug log
预期输出
2023-11-03 10:45:16.450 +0530 INFO: [main.py:14 - component_log() ] I log this in component log 2023-11-03 10:45:16.450 +0530 DEBUG: [main.py:17 - component_debug_log() ] I log this in component debug log
我只能控制main.py,无法修改其他文件源代码,仅可通过继承或猴子补丁调整,请问如何解决该问题?
内容的提问来源于stack exchange,提问作者scientific_explorer
相关产品推荐
相关产品推荐

