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

Sna*_*xib 5 python file-io logging sikuli

我在这里浏览了python日志类的教程,并没有看到任何可以让我为同一输出制作不同级别的多个日志的东西.最后我想有三个日志:( <timestamp>_DEBUG.log调试级别)
<timestamp>_INFO.log(信息级别)
<timestamp>_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])
Run Code Online (Sandbox Code Playgroud)

这是一个运行的例子是:

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])
Run Code Online (Sandbox Code Playgroud)

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

任何想法为什么?

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

所以我意识到没有任何记录比警告更"低".即使我删除过滤器,debugLogFileHandler.setLevel(logging.DEBUG)它似乎并不重要.如果我将实际日志命令设置为logger.warning或更高,它将打印到日志.当然,一旦我取消注释,debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))我就不会进行任何日志活动Debug.log.我很想制作我自己的日志级别,但这似乎是一个非常糟糕的主意,以防任何人/其他任何人使用此代码.

<------------------------- Final UPDATE --------------------->
好吧,我是愚蠢的,忘了设置记录器本身来记录DEBUG级事件.因为默认情况下,日志记录类不记录任何低于警告的内容,所以它没有记录我发送的任何调试信息.

最后感谢@Robert过滤器.

rob*_*ert 11

创建多个处理程序,每个处理程序用于一个输出文件(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))
Run Code Online (Sandbox Code Playgroud)