当前位置: 首页 > 面试题库 >

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

轩辕翰
2023-03-14
问题内容

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

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

<------------- UPDATE#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.log并且会debug.log被创建,而只会error.log填充条目。

知道为什么吗?

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

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

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

最后感谢并向@Robert表示感谢。


问题答案:

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


 类似资料:
  • 现在,问题是,当我以以下方式进行日志记录时: 尽管根记录器级别被设置为“错误”,但日志条目仍然存在于两个日志文件中。然而,当我去掉“it.pkg.testpkg.service”记录器(通过注释或删除它)时,条目停止进入根记录器。我不太清楚这是怎么回事。 目前,我已经找到了一个临时解决方案,方法是在“root_file_appender”中添加以下条目: 谢了。

  • 我想做的很直截了当: 我只希望在控制台追加器上显示重要的消息,而我希望将详细的消息路由到文件追加器。 我还尝试向添加一个ThresholdFilter,但这也不能过滤它。

  • SLF4J具有以下日志级别 JDK日志记录具有以下日志级别 如果我想将日志级别设置为DEBUG,那么该级别在JDK日志中不可用。谁能解释一下在这种情况下我们如何获得调试级别的日志记录。对于这种情况,我们需要做什么额外的配置吗? 已更新 这是我的属性文件配置 请让我知道我哪里错了。

  • 我正在我的应用程序中使用 ESAPI 记录器。Logger logger= ESAPI.getLogger(ABC.class) 在ABC课堂上。java,我们使用INFO级别打印日志。根据我们所知的定义,Info接受: 两个参数:信息(Logger.EventType type, java.lang.字符串消息) 三个参数:信息(Logger.EventType type, java.lang.

  • 在log4j2文档log4j2 java配置中,默认配置为: 根本就不在那里。它仍将只打印出错误日志。 问题 是否有其他人遇到此问题? 有人能复制它吗? 有人知道怎么修吗?我几乎要给别人一块钱。不过,我肯定会把他们的答案标成绿色。 我的最终目标是让特定的记录器发送SMTP请求。我很确定我知道怎么做,我只是在和这个小问题作斗争

  • 我们有两个不同的ASP.NET应用程序启用了Log4net日志记录。它们都有相同的log4net1.2.10.0版本。