我有一个小的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')
目前,我在开始记录消息之前在每个模块中执行此初始化。是否有可能在一个地方只执行一次初始化,以便通过在整个项目中进行日志记录来重用相同的设置?
实际上,每个记录器都是父包记录器的子包(即package.subpackage.module
从package.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!")
有关更多信息,请参阅高级日志记录教程。
最佳实践是,在每个模块中,有一个记录器定义如下:
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')
并根据需要记录到loggera
和loggerb
。
在您的一个或多个主程序中,请执行以下操作:
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