Python 仅记录来自脚本的日志

标签 python logging

我目前在我的一个简单脚本中使用 Python 日志记录模块,设置如下。

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S')
logger = logging.getLogger(__name__)

我的问题是这也会捕获 3rd 方模块,例如请求并从它们输出 info() 日志消息。有没有办法抑制这些消息或告诉日志记录模块只记录我自己的脚本中的消息?

最佳答案

上面的答案并不正确 - 它只会将来自其他模块的消息设置得更高。

一个非常快速的方法是使用这段代码:

import logging.config
logging.config.dictConfig({
    'version': 1,
    'disable_existing_loggers': True,
})

您必须在导入所有模块后设置它 - 它会禁用到目前为止创建的所有记录器。这在大多数情况下都会起作用,但是例如,当您创建类实例时,某些模块会创建它们的记录器(稍后会在您的代码中发生)。


当您根据基本 python 教程设置记录器时,它们会告诉您使用 logging.basicConfig(...)。这是一个问题,因为这会将处理程序(即日志将被路由到的位置)设置为 logging.lastResort,这是从 Python 3.2 开始的 stderr,用于全局中的 all 记录器过程。这意味着您现在已为所有模块启用完整日志记录。

因此,更好的方法是仅为您的模块创建不同的记录器,并为其提供一些自己的处理程序,而不是使用 basicConfig()

有两种方法:

1) 所有功能:

import logging

log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", 
                          datefmt="%Y-%m-%d - %H:%M:%S")
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
fh = logging.FileHandler("mylog.log", "w")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
log.addHandler(ch)
log.addHandler(fh)

这将为您提供记录器 log,然后您可以像 log.error("Error found") 一样使用它。它将写入一个名为 mylog.log 的新文件,并且还会记录 sys.stdout。当然,您可以随意更改。

2) 使用字典:

import logging
import logging.config

DEFAULT_LOGGING = {
    'version': 1,
    'formatters': { 
        'standard': {
            'format': '%(asctime)s %(levelname)s: %(message)s',
            'datefmt': '%Y-%m-%d - %H:%M:%S' },
    },
    'handlers': {
        'console':  {'class': 'logging.StreamHandler', 
                     'formatter': "standard", 
                     'level': 'DEBUG', 
                     'stream': sys.stdout},
        'file':     {'class': 'logging.FileHandler', 
                     'formatter': "standard", 
                     'level': 'DEBUG', 
                     'filename': 'live_detector.log','mode': 'w'} 
    },
    'loggers': { 
        __name__:   {'level': 'INFO', 
                     'handlers': ['console', 'file'], 
                     'propagate': False },
    }
}

logging.config.dictConfig(DEFAULT_LOGGING)
log = logging.getLogger(__name__)

这将给出与上面相同的结果,但会更长一些,但可能更易于阅读。这也会自动设置 'disable_existing_loggers': True。如果你不想这样,你必须添加它并将其设置为 False。

关于Python 仅记录来自脚本的日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8269294/

相关文章:

asp.net-mvc - 如何为 Asp.NET MVC 应用程序设置 log4net

.net - Common.Logging 有什么替代品吗?

python - Django 中有没有办法直接从模型获取当前经过身份验证的用户?

python - 如何使用 Python 将 JPG 图像转换为 AVIF

php - 在运行服务时写入带有日期的日志文件

regex - 从 Linux 中的日志行过滤多个特定值

python - 导入 flask.ext 引发 ModuleNotFoundError

python - 在 django 中使用 dict_cursor

python - 在 Tkinter 中制作一个粘到东方、西方和南方的小部件

java - 如何避免slf4j日志记录中出现多个日志文件?