【问题标题】:How to redirect another library's console logging messages to a file, in Python如何在 Python 中将另一个库的控制台日志消息重定向到文件
【发布时间】:2021-01-27 18:33:23
【问题描述】:

我为我编写的 API 导入的 fastAPI 库将许多 logging.INFO 级别消息写入控制台,我希望将其重定向到基于文件的日志,或者理想情况下,同时重定向到控制台和文件。这是我控制台中 fastAPI 模块记录事件的示例:

所以我尝试实现this Stack Overflow 答案(“Easy-peasy with Python 3.3 and above”),但它创建的日志文件(“api_screen.log”)始终为空......

# -------------------------- logging ----------------------------
logging_file = "api_screen.log"

logging_level = logging.INFO
logging_format = '  %(message)s'
logging_handlers = [logging.FileHandler(logging_file), logging.StreamHandler()]

logging.basicConfig(level = logging_level, format = logging_format, handlers = logging_handlers)
logging.info("------logging test------")

即使我自己的“-----logging test------”消息确实出现在其他 fastAPI 日志中的控制台上:

正如您在此处看到的,它已创建文件,但大小为零。

那么我还需要做什么才能使文件日志记录正常工作?

【问题讨论】:

标签: python logging


【解决方案1】:

这里有多个问题。首先也是最重要的:如果已经配置了记录器,basicConfig 什么也不做,fastAPI 就是这样做的。因此,您创建的处理程序永远不会被使用。当您调用 logging.info() 时,您正在向根记录器发送一个日志,该日志会被打印,因为 fastAPI 已向其添加了一个处理程序。您也没有设置处理程序的级别。试试这个代码,而不是你目前拥有的:

logging_file = "api_screen.log"
logging_level = logging.INFO

logging_fh = logging.FileHandler(logging_file)
logging_sh = logging.StreamHandler()
logging_fh.setLevel(logging_level)
logging_sh.setLevel(logging_level)

root_logger = logging.getLogger()
root_logger.addHandler(logging_fh)
root_logger.addHandler(logging_sh)

logging.info('--test--')

【讨论】:

  • 效果很好,实际上因为控制台日志记录已经由 fastapi 设置,我不需要流处理程序,只需要文件处理程序。现在还有一个问题,如何设置 logging_fh 的消息格式?现在它只是打印出日志消息,但我想添加一个时间戳。
  • 想通了。使用 formatter = logging.Formatter("message format goes here") 然后 logging_fh.setFormatter(formatter)。
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多