You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:17:06