如何结合自定义Logger类使用getLogger方法?
规范实现自定义Logger类的方法
要让logging.getLogger()返回自定义的Logger类实例,正确的做法是使用logging.setLoggerClass()方法,而非setDefaultClass(后者是Handler类的方法,用于设置默认处理器类,和Logger无关)。具体步骤如下:
1. 定义自定义Logger类
继承标准库的logging.Logger,重写需要自定义的方法(如info、error):
import logging class CustomLogger(logging.Logger): def info(self, msg, custom_param=None, *args, **kwargs): # 添加自定义参数处理逻辑 if custom_param is not None: msg = f"[自定义参数: {custom_param}] {msg}" # 调用父类的info方法完成日志输出 super().info(msg, *args, **kwargs) def error(self, msg, custom_code=None, *args, **kwargs): if custom_code is not None: msg = f"[错误码: {custom_code}] {msg}" super().error(msg, *args, **kwargs)
2. 全局设置默认Logger类
必须在第一次调用logging.getLogger()之前执行这个设置,确保后续所有获取的Logger实例都是自定义类:
# 在程序初始化阶段(比如主模块开头)设置 logging.setLoggerClass(CustomLogger)
3. 在任意模块中使用自定义Logger
之后在任何模块调用getLogger(),返回的都是CustomLogger实例,可以直接使用自定义参数:
# 其他模块中 import logging logger = logging.getLogger(__name__) logger.info("测试日志", custom_param="TEST_001") logger.error("错误日志", custom_code=500)
注意事项
- 如果在设置
setLoggerClass()之前已经调用过getLogger(),已存在的Logger实例仍然是标准Logger类。这种情况下,若要替换已有实例,只能通过修改__class__属性,但这属于非常规操作,不推荐。规范做法是确保在所有日志操作前完成Logger类的设置。
内容的提问来源于stack exchange,提问作者Arshalok
相关产品推荐
相关产品推荐

