当前位置: 首页 > 知识库问答 >
问题:

在多个模块中使用日志记录

钮承恩
2023-03-14

我有一个小的python项目,它有如下结构--

Project 
 -- pkg01
   -- test01.py
 -- pkg02
   -- test02.py
 -- logging.conf

我计划使用默认日志模块将消息打印到stdout和一个日志文件。要使用日志模块,需要进行一些初始化-

import logging.config

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('pyApp')

logger.info('testing')

目前,我在开始记录消息之前在每个模块中执行此初始化。是否有可能在一个地方只执行一次初始化,以便通过在整个项目中进行日志记录来重用相同的设置?

共有2个答案

阳光辉
2023-03-14

实际上,每个记录器都是父包记录器的子包(即package.subpackage.modulepackage.subpackage)继承配置,所以您需要做的只是配置根记录器。这可以通过logging.config.fileconfig(您自己的记录器配置)或logging.basicconfig(设置根记录器)来实现。在您的条目模块中安装日志记录(__main__.py或您想要运行的任何内容,例如main_script.py.__init__.py也可以运行)

使用BasicConfig:

# package/__main__.py
import logging
import sys

logging.basicConfig(stream=sys.stdout, level=logging.INFO)

使用FileConfig:

# package/__main__.py
import logging
import logging.config

logging.config.fileConfig('logging.conf')

然后使用以下方法创建每个记录器:

# package/submodule.py
# or
# package/subpackage/submodule.py
import logging
log = logging.getLogger(__name__)

log.info("Hello logging!")

有关更多信息,请参阅高级日志记录教程。

臧增
2023-03-14

最佳实践是,在每个模块中,有一个记录器定义如下:

import logging
logger = logging.getLogger(__name__)

在模块顶部附近,然后在模块中的其他代码中做例如。

logger.debug('My message with %s', 'variable data')

如果需要在模块中细分日志记录activity,请使用例如。

loggerA = logging.getLogger(__name__ + '.A')
loggerB = logging.getLogger(__name__ + '.B')

并根据需要记录到loggeraloggerb

在您的一个或多个主程序中,请执行以下操作:

def main():
    "your program code"

if __name__ == '__main__':
    import logging.config
    logging.config.fileConfig('/path/to/logging.conf')
    main()

def main():
    import logging.config
    logging.config.fileConfig('/path/to/logging.conf')
    # your program code

if __name__ == '__main__':
    main()

请参阅此处以了解从多个模块进行日志记录的情况,并参阅此处以了解将被其他代码用作库模块的代码的日志配置。

更新:当调用fileconfig()时,如果您使用的是Python2.6或更高版本,您可能希望指定disable_existing_loggers=false(有关更多信息,请参阅文档)。为了向后兼容,默认值为true,这会导致fileconfig()禁用所有现有记录器,除非它们或它们的祖先在配置中显式命名。当值设置为false时,现有的记录器就不存在了。如果使用Python 2.7/Python 3.2或更高版本,您可能希望考虑dictConfig()API,它比fileConfig()更好,因为它提供了对配置的更多控制。

 类似资料:
  • 我正在使用Python日志模块,并希望禁用由我导入的第三方模块打印的日志消息。例如,我使用的是如下所示: 当我执行logger.debug时,它会输出我的调试消息(“my Message!”),但它也会从我导入的任何模块中输出调试消息(如请求和许多其他东西)。 我只想看到我感兴趣的模块的日志消息。有没有可能让日志模块做到这一点?

  • 问题内容: 我正在使用python记录器。以下是我的代码: 我的问题是我在每个呼叫的日志文件中都有多个条目。我该如何解决? 问题答案: 该已经是一个单例。(文件) 问题在于,每次调用时,都会向实例添加另一个处理程序,这将导致日志重复。 也许像这样?

  • 我的目标是从多个模块进行日志记录,同时只在一个地方配置记录器--在主程序中。如本答案所示,应包括 在主程序中,然后在所有其他模块中包括 我相信这就是我在下面所做的,然而我却得到了意想不到的行为。 我所期望的是,当在中执行时,会从记录一条消息,然而,情况并非如此。这是令人困惑的,因为当在中从模块级调用记录器时,它会将消息记录到控制台,但当从内部调用时,它不会。 所以我注意到如果我移除这条线 从开始,

  • 我可以创建一个命名的子记录器,以便该记录器输出的所有日志都用它的名称标记。我可以只在函数/类/任何东西中使用记录器。 但是,如果该代码调用了另一个模块中的函数,该模块仅使用日志模块函数(根记录器的代理)进行日志记录,我如何确保这些日志消息通过相同的记录器(或者至少以相同的方式记录)? 例如: main.py 其他.py 产出: 我希望能够使两个日志行都标记为名称'stuff',我希望能够做到这一点

  • 问题内容: 我正在尝试用Python的日志记录模块替换临时日志记录系统。我正在使用日志记录系统在一行上输出长任务的进度信息,因此您可以在控制台中记录日志或查看它。我通过在日志记录功能上设置一个标志来完成此操作,该标志可禁止该日志消息的换行符并逐段构建该行。 所有日志记录都是从单个线程完成的,因此没有序列化问题。 使用Python的日志记录模块可以做到这一点吗?这是个好主意吗? 问题答案: 让我们从

  • 问题内容: 我想知道如何实现一个全局记录器,该记录器可以用自己的设置在任何地方使用: 我目前有一个自定义记录器类: 该类在一个单独的文件中,其中包含一些格式化程序和其他内容。记录器可以完美地独立运行。 我将此模块导入我的主python文件中,并创建一个像这样的对象: 但显然,我无法从代码的其他部分访问此对象。我使用错误的方法吗?有一个更好的方法吗? 问题答案: 使用创建一个名为全球记录。 main