使用Python logger类为不同日志级别生成多个日志

6 投票
1 回答
7138 浏览
提问于 2025-04-17 02:27

我查看了这里关于Python日志类的教程,但没有找到可以让我为同一个输出生成多个不同级别日志的方法。最后,我希望能有三个日志文件:<时间戳>_DEBUG.log(调试级别)
<时间戳>_INFO.log(信息级别)
<时间戳>_ERROR.log(错误级别)

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

<-------------更新 #1-------------------------->
根据@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里有内容。

你知道为什么吗?

<------------------------更新 #2----------------------->

我意识到没有记录任何低于警告级别的日志。即使我去掉过滤器并设置debugLogFileHandler.setLevel(logging.DEBUG),似乎也没有用。如果我把实际的日志命令设置为logger.warning或更高,它就会被记录到日志里。当然,一旦我取消注释debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))Debug.log就不会有任何日志活动。我有点想自己定义一个日志级别,但这似乎是个坏主意,以防其他人使用这段代码。

<-------------------------最终更新--------------------->
我真是傻,忘了把日志记录器本身设置为记录DEBUG级别的事件。因为默认情况下,日志类不会记录低于警告级别的任何内容,所以我发送的调试信息都没有被记录。

最后感谢@Robert提供的过滤器。

1 个回答

15

创建多个处理器,每个处理器对应一个输出文件(比如 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))

撰写回答