python getLogger 不适用于派生记录器

标签 python logging

我创建了一个扩展 logging.Logger 的 CustomLogger。我正在尝试使用 getLogger 来获取我的记录器实例化。这是我的代码:

import os
import sys
import logging
import atexit

class CustomLogger(logging.Logger):
    def __init__(self,name,logfile):
        super().__init__(name, level=logging.DEBUG)
        self.logfile_handler = logging.FileHandler(logfile)
        self.logfile_handler.setLevel(logging.DEBUG)
        self.logfile_handler.setFormatter(logging.Formatter('%(name)s | %(levelname)s | %(message)s'))
        self.addHandler(self.logfile_handler)
        atexit.register(logging.shutdown)

        print("Created logger: " + name + "  " + logfile)

mycustom = CustomLogger("cust","./cust.log")
mycustom.critical("from direct write")  #CORRECTLY WRITES TO FILE
logging.getLogger("cust").critical("from getLogger") #FAILS TO WRITE TO FILE

如何使用 getLogger 写入自定义实例?

我的意图是在其他模块中使用 logging.getLogger("cust") 来写入此记录器。

最佳答案

logging.getLogger("cust") 尝试使用 logging.Manager 获取或创建,Manager 使用 实例化新记录器默认情况下是 Logger 类,您可以通过调用 logging.setLoggerClass 全局更改它。如果你不想这样做,你可以将你的记录器实例注册到 Manager:

class CustomLogger(logging.Logger):
    def __init__(self,name,logfile):
        super().__init__(name, level=logging.DEBUG)
        ...
        self.manager.loggerDict[name] = self

显然,这是一个 hack。

关于python getLogger 不适用于派生记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47056588/

相关文章:

javascript - 使用selenium和Python在iframe内显示图像的src

python - 根据条件重新索引数据框的行

sql-server - 如何记录存储过程的频率和上次使用时间?

java - hsqldb 内部事件日志配置

Node.js - 记录/使用 morgan 和 winston

Spring 框架中的 java 日志记录与 Log4j。哪一个最合适

java - logback 未设置 Spring 日志记录阈值

python - 使用 Python 计算数据框中唯一单词的数量

python - 在 python 中创建/制作目录(复杂)

python 调用 shell 命令(打开)并等待命令完成。工作完成后如何获得信号?