首页 文章

通过代码问题进行Python模块级日志配置

提问于
浏览
0

我试图通过代码工作三个输出来获得模块级日志记录:文件,控制台和应用程序内部(QTextEdit) .

我可以让所有三个 Logger 使用下面的代码,但应用程序内部 Logger 不记录所有事件,控制台 Logger (仅)打印每行两次 .

我试过用

logging.getLogger(__name__)

对于文件 Logger 而不是root(没有生成日志),对于控制台是相同的(每个日志输出只有1行可以正常工作)和MyLogHandler(没有生成日志)相同,并尝试了root logger和'name' Logger 的各种组合但无法使所有日志工作,并且控制台每个日志事件只打印一行 .

def configCodeRootExample_(self):
    logFileName = self.getLogLocation()
    rootLogger = logging.getLogger('')
    #This logger works
    fileLogger = logging.FileHandler(logFileName)
    fileLogger.setLevel(logging.INFO)
    fileFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
    fileLogger.setFormatter(fileFormatter)
    rootLogger.addHandler(fileLogger)
    #This logger works but prints output twice
    consoleFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(module)s - %(funcName)s - %(lineno)d - %(message)s')
    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    console.setFormatter(consoleFormatter)
    rootLogger.addHandler(console)
    #This logger works but only logs a subset of DEBUG events and no INFO events
    myLogHandler = GSLLogHandler()
    myLogHandler.setLevel(logging.DEBUG)
    myLogHandler.setFormatter(fileFormatter)
    rootLogger.addHandler(myLogHandler)

此处的记录也是输出到监听QTextEdit的日志处理程序:

import logging
from loggerpackage.logsignals import LogSignals

class MyLogHandler(logging.Handler): 
    def __init__(self):
        logging.Handler.__init__(self)
        self.logSignals = LogSignals()

    def emit(self, logMsg):
        logMsg = self.format(logMsg)
        self.logSignals.logEventTriggered.emit(logMsg)

如果我将控制台 Logger 更改为模块级别:

logger = logging.getLogger(__name__)
    consoleFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(module)s - %(funcName)s - %(lineno)d - %(message)s')
    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    console.setFormatter(consoleFormatter)
    logger.addHandler(console)

然后每个日志事件只打印一行,但格式不正确,它似乎是某种默认格式化程序

1 回答

  • 0

    请参阅此处获取重复控制台日志记录的解决方案:How to I disable and re-enable console logging in Python?

    logger = logging.getLogger()
    lhStdout = logger.handlers[0]
    
    ... add log handlers
    
    logger.removeHandler(lhStdout)
    

    我在使用MyLogHandler时遇到的问题是QTextEdit上的插槽没有及时连接以接收前几个DEBUG和INFO事件 .

相关问题