扩展 Python 记录器

Col*_*ips 3 python logging stdout

我正在寻找一种简单的方法来扩展标准 python 库中定义的日志记录功能。我只想能够选择是否将我的日志也打印到屏幕上。

示例:通常要记录警告,您会调用:

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s: %(message)s', filename='log.log', filemode='w')
logging.warning("WARNING!!!")
Run Code Online (Sandbox Code Playgroud)

这将设置日志的配置并将警告放入日志中

我想要一些类似的电话:

logging.warning("WARNING!!!", True)
Run Code Online (Sandbox Code Playgroud)

其中 True 语句表示日志是否也打印到标准输出。

我已经看到了一些覆盖记录器类的实现示例

但我是这门语言的新手,并没有真正了解正在发生的事情,或者如何实现这个想法。任何帮助将不胜感激 :)

Dmi*_*sky 6

Python 日志模块定义了这些类:

发出日志消息的记录器。将这些消息放到目的地的
处理程序
格式化日志消息的格式化程序。过滤日志消息的
过滤器。

一个Logger可以有Handlers。您可以通过调用该addHandler()方法来添加它们。一个处理程序可以有过滤器格式化程序。您可以通过分别调用addFilter()setFormatter()方法来类似地添加它们。

它是这样工作的:

import logging

# make a logger
main_logger = logging.getLogger("my logger")
main_logger.setLevel(logging.INFO)

# make some handlers
console_handler = logging.StreamHandler() # by default, sys.stderr
file_handler    = logging.FileHandler("my_log_file.txt")

# set logging levels
console_handler.setLevel(logging.WARNING)
file_handler.setLevel(logging.INFO)

# add handlers to logger
main_logger.addHandler(console_handler)
main_logger.addHandler(file_handler)
Run Code Online (Sandbox Code Playgroud)

现在,您可以像这样使用这个对象:

main_logger.info("logged in the FILE")
main_logger.warning("logged in the FILE and on the CONSOLE")
Run Code Online (Sandbox Code Playgroud)

如果你只是python在你的机器上运行,你可以在交互式控制台中输入上面的代码,你应该会看到输出。如果您有权在其中创建文件,日志文件将在您的当前目录中打包。

我希望这有帮助!