【问题标题】:Logging different python files in the same file在同一个文件中记录不同的python文件
【发布时间】:2022-01-15 16:37:17
【问题描述】:

我有一个名为 bar.py 的自定义模块,我将它导入到我的一些脚本中。它实际上是通过 pip install 从 pypi 索引导入的。 bar.py 模块看起来像这样(这实际上是我实际拥有的一个过于简化的示例,因此我可以在这里排除我的疑问。

import logging

def do_bar_logged():
    logging.INFO('START DOING SOMETHING')
    do_bar()
    logging.INFO('END DOING SOMETHING')

我在其中导入 bar 的 do_bar_logged 的​​脚本之一称为 foo.py。它看起来像这样。

import logging
from bar import do_bar_logged  # I need to install via pip bar before being able to import this, just like a regular module.

def main():
    logging.INFO('START CALLING DO_BAR')
    do_bar_logged()
    logging.INFO('END CALLING DO_BAR')

我的问题是:是否有可能让两个日志都指向同一个文件而无需对任何内容进行编码?

【问题讨论】:

  • 内置logging 专门为此而生。看看Logging HOWTO
  • 有可能。但不清楚你在问什么。有很多方法可以实现您的目标
  • @Adelin 我需要登录到放置在多个脚本中的相同文件。如果不对文件名进行硬编码,这可能吗?
  • 你可以重定向标准输出。
  • 当然。但理想情况下,您也不会使用 print 调用进行日志记录。

标签: python logging


【解决方案1】:

你可以像这样使用logging模块

bar.py

import logging


def aux_print():
    logging.warning('This is my auxiliary script')

main.py

import logging
from bar import aux_print

logging.basicConfig(
    filename="log.txt",
    filemode='a',
    format='[%(asctime)s,%(msecs)d] [%(levelname)s]: %(message)s',
    datefmt='%H:%M:%S',
    level=logging.DEBUG
)


def main():
    logging.info('This is my main script')
    aux_print()


if __name__ == '__main__':
    main()

输出log.txt:

[18:58:23,708] [INFO]: This is my main script
[18:58:23,708] [WARNING]: This is my auxiliary script

【讨论】:

  • 谢谢!这也适用于我对我的问题所做的编辑吗?
  • @JaviTorre 如果bar 库使用logging 模块不是,它应该将日志写入文件。
  • 谢谢!那么,如果我理解正确,日志库会记录到父脚本调用它的处理程序?
【解决方案2】:

logging 模块允许您将调用 print 替换为调用特殊日志记录函数,这些函数可以配置为以各种方式运行。当您替换后端处理程序以记录您想要的位置时,顶端的日志记录调用保持不变。

将多个脚本记录到一个目标可能很棘手。您不能只写一个文件,因为日志往往会相互覆盖(锁定文件处理程序可以提供帮助)。最简单的方法之一是使用SysLogHandler (linux/mac) 和NTEventLogHandler (windows) 处理程序记录到常规系统日志。

或者您可以使用一些低级处理程序(HTTP、套接字、dgram、队列)来编写您自己的日志服务器来聚合日志。您甚至可以使用 SQL 或 NOSQL 处理程序记录到数据库。日志记录是一件大事,并且有很多第 3 方日志记录模块。值得一看,看看有没有对你有用的。

【讨论】:

  • 谢谢!将日志记录到 DB 部分实际上是一个非常好的主意。这也适用于我刚刚对答案所做的编辑吗?
  • 是的。您的脚本会抓取记录器,但您还需要一些东西来设置它们。您可以使用知道如何创建所需的日志记录处理程序的 python 脚本来做到这一点。把它放在你的模块路径中,然后让你的顶级脚本导入它。一种选择是logging.config.fileconfig,您可以在其中使用配置文件。例如,您可以编写所有脚本以获取 ~/.my_logging_config.ini 并使用其中的任何内容。
  • 感谢大师班。
猜你喜欢
  • 2012-10-18
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多