【问题标题】:using Python logger class to generate multiple logs for different log levels使用 Python logger 类为不同的日志级别生成多个日志
【发布时间】:2011-11-18 19:54:16
【问题描述】:

我在这里查看了 python 日志记录类的教程,没有看到任何可以让我为同一输出制作不同级别的多个日志的内容。最后我想要三个日志: <timestamp>_DEBUG.log(调试级别)
<timestamp>_INFO.log(信息级别)
<timestamp>_ERROR.log(错误级别)

有没有办法在一个脚本中为同一输入生成多个日志文件?


因此,在实施@robert 的建议时,我现在遇到了一个小问题,可能是由于没有完全理解他的代码在做什么。

这是我在 scriptRun.py 中的代码

import os
import logging

logger = logging.getLogger("exceptionsLogger")
debugLogFileHandler = logging.FileHandler("Debug.log")
errorLogFileHandler = logging.FileHandler("Error.Log")
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
errorLogFileHandler.setFormatter(formatter)
debugLogFileHandler.setFormatter(formatter)
logger.addHandler(debugLogFileHandler)
logger.addHandler(errorLogFileHandler)

class LevelFilter(logging.Filter):
    def __init__(self, level):
        self.level = level
    def filter(self, record):
        return record.levelno == self.level
debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
errorLogFileHandler.addFilter(LevelFilter(logging.ERROR))

directory = []
for dirpath, dirnames, filenames in os.walk("path\to\scripts"):
    for filename in [f for f in filenames if f.endswith(".py")]:
        directory.append(os.path.join(dirpath, filename))
for entry in directory:
    execfile(entry)
    for lists in x:
        if lists[0] == 2:
            logger.error(lists[1]+"   "+lists[2])
        elif lists[0] == 1:
            logger.debug(lists[1]+"   "+lists[2])

运行的一个例子是:

import sys

def script2Test2():
    print y
def script2Ttest3():
    mundo="hungry"

global x 
x = []

theTests = (test2, test3)

for test in theTests:
    try:
        test()
        x.append([1,test.__name__," OK"])
    except:
        error = str(sys.exc_info()[1])
        x.append([2,test.__name__,error])

现在我的问题是:运行 scriptRun.py 在我运行它时不会抛出任何错误,并且创建了 error.logdebug.log,但只有 error.log 填充了条目。

知道为什么吗?

所以我意识到没有记录“低于”警告的内容。即使我删除了过滤器和debugLogFileHandler.setLevel(logging.DEBUG),这似乎也无关紧要。如果我将实际的日志命令设置为logger.warning 或更高,它将打印到日志中。当然,一旦我取消注释debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG)),我在Debug.log 中就没有日志活动。我很想创建自己的日志级别,但这似乎是一个非常糟糕的主意,以防万一任何人/任何其他人使用此代码。


好吧,我很愚蠢,忘记将记录器本身设置为记录 DEBUG 级别的事件。由于默认情况下日志记录类不会记录任何低于警告的内容,因此它不会记录我发送的任何调试信息。

最后感谢@Robert 过滤器。

【问题讨论】:

    标签: python logging file-io sikuli


    【解决方案1】:

    创建多个处理程序,每个处理程序用于一个输出文件(INFO.log、DEBUG.log 等)。

    为每个只允许特定级别的处理程序添加一个过滤器。

    例如:

    import logging
    
    # Set up loggers and handlers.
    # ...
    
    class LevelFilter(logging.Filter):
        def __init__(self, level):
            self.level = level
    
        def filter(self, record):
            return record.levelno == self.level
    
    debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
    infoLogFileHandler.addFilter(LevelFilter(logging.INFO))
    

    【讨论】:

    • 只是为了让我更好地理解它:只使用一个记录器(不要使用多个记录器为不同级别创建多个文件),并使用此类过滤每个文件处理程序看到的日志消息?
    • 是的,就是这样。记录器代表应用程序的区域,处理程序代表记录事件的目的地,过滤器可以应用于其中一个或两个,以选择性地从所有或某些目的地删除事件。
    • 是的。当然你也可以创建多个记录器,但是编写 debugLog.debug("foo") 等非常麻烦。
    • 我也可以这样吗?:GUILogger = logging.getLogger("guiLogger")dh = logging.FileHandler(logFileDEBUG)dh.setlevel(logging.DEBUG)ih = logging.FileHandler(logFileINFO)ih.setlevel(logging.INFO)eh = logging.FileHandler(logFileERROR)eh.setlevel(logging.ERROR)GUILogger.addHandler(dh)GUILogger.addHandler(ih)@9 >
    • @Snaxib:例如,通过这种方法,您的 DEBUG.log 还将包含 INFO、WARNING 和 ERROR 消息等。
    猜你喜欢
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2016-04-18
    • 2023-02-17
    相关资源
    最近更新 更多