防止Python记录器打印到控制台

6

我开始对来自Python的日志模块感到不满,因为我已经不知道为什么记录器要将日志消息打印到控制台(在DEBUG级别上,尽管我将我的FileHandler设置为INFO)。日志文件生成正确。 但我不希望在控制台上看到任何日志信息。 这是我的日志器配置:

template_name = "testing"
fh = logging.FileHandler(filename="testing.log")
fr = logging.Formatter("%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s")
fh.setFormatter(fr)
fh.setLevel(logging.INFO)
logger = logging.getLogger(template_name)
# logger.propagate = False # this helps nothing
logger.addHandler(fh)

希望有人能帮我一下 :)


1
logging.getLogger()(无参数)将获取根记录器。它是层次结构中最高的记录器,可能会记录您的情况。您应该尝试设置其级别。 - Klaus D.
我的回答有帮助吗?还是您仍然遇到问题? - Daniel Haley
这个问题有没有解决方案?@aAnnAa - StressedBoi69420
1
@StressedBoi69420,不幸的是,没有! 但我并没有在其他特定环境下遇到这个问题。 - aAnnAa
1
我能够在我的笔记本上抑制它。我唯一拥有的行是 logging.basicConfig(filename='my.log', level=logging.INFO) 和常规的 logging.info(...)。希望这可以帮助到您。 - StressedBoi69420
显示剩余5条评论
3个回答

3
我发现这个问题,因为我遇到了类似的问题,当我删除了 logging.basicConfig() 后,它开始在控制台上打印所有日志。
在我的情况下,我需要在每次运行时更改文件名,以将日志文件保存到不同的目录中。在顶部添加基本配置(即使初始文件名从未使用过),解决了我的问题。(很抱歉,我无法解释原因。)
帮助我的是在开头添加基本配置:
logging.basicConfig(filename=filename,
                        format='%(levelname)s - %(asctime)s - %(name)s - %(message)s',
                        filemode='w',
                        level=logging.INFO)

然后通过在每次运行中添加处理程序来更改文件名:

file_handler = logging.FileHandler(path_log + f'/log_run_{c_run}.log')
formatter    = logging.Formatter('%(asctime)s : %(levelname)s : %(name)s : %(message)s')
file_handler.setFormatter(formatter)
logger_TS.addHandler(file_handler)

另外一个好奇的点是,如果我在设置带有新文件名的处理程序之前不设置格式化程序 (file_handler.setFormatter(formatter)),那么最初格式化的日志记录(levelname、time等)将缺失在日志文件中。

因此,关键是先设置 logging.basicConfig,然后再添加处理程序。就像 @StressedBoi69420 上面指出的那样。

希望这能有点帮助。


0

您应该能够添加一个StreamHandler来处理标准输出,并将处理程序的日志级别设置为高于50的级别。(标准日志级别为50及以下。)

我会这样做的一个例子...

import logging
import sys

console_log_level = 100

logging.basicConfig(level=logging.INFO,
                    format="%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s",
                    filename="testing.log",
                    filemode="w")
console = logging.StreamHandler(sys.stdout)
console.setLevel(console_log_level)
root_logger = logging.getLogger("")
root_logger.addHandler(console)

logging.debug("debug log message")
logging.info("info log message")
logging.warning("warning log message")
logging.error("error log message")
logging.critical("critical log message")

testing.log的内容...

2019-11-21 12:53:02,426,426 root INFO info log message
2019-11-21 12:53:02,426,426 root WARNING warning log message
2019-11-21 12:53:02,426,426 root ERROR error log message
2019-11-21 12:53:02,426,426 root CRITICAL critical log message

注意:我使用console_log_level变量的唯一原因是因为我从一个默认函数中提取了大部分代码,该函数将根据参数值设置控制台日志级别。这样,如果我想让脚本“安静”,我可以根据脚本的命令行参数更改日志级别。

0
另一种做法是先创建FileHandler,然后调用basicConfig方法,就像这样。
import logging

template_name = "testing"
fh = logging.FileHandler(filename="testing.log")
logger = logging.getLogger(template_name)
logging.basicConfig(
    format="%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s",
    level=logging.INFO,
    handlers=[fh],
)
logger.info("Test")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接