在多个模块中使用Python日志

2024-09-28 10:13:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个小的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')

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


Tags: 模块项目pyprojectconfig消息loggingconf
3条回答

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

import logging
logger = logging.getLogger(__name__)

在模块顶部附近,然后在模块中的其他代码中执行

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

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

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()

请参阅here以获取来自多个模块的日志,以及here以获取将被其他代码用作库模块的代码的日志配置。

更新:调用fileConfig()时,如果使用的是Python 2.6或更高版本,则可能需要指定disable_existing_loggers=False(有关详细信息,请参见the docs)。默认值为True表示向后兼容,这将导致所有现有的日志记录器被fileConfig()禁用,除非它们或它们的祖先在配置中显式命名。值设置为False时,现有的记录器将保持独立。如果使用Python 2.7/Python 3.2或更高版本,您可能希望考虑使用比fileConfig()更好的dictConfig()API,因为它提供了对配置的更多控制。

我总是这样做。

使用单个python文件将我的日志配置为名为“log_conf.py”的单例模式

#-*-coding:utf-8-*-

import logging.config

def singleton(cls):
    instances = {}
    def get_instance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return get_instance()

@singleton
class Logger():
    def __init__(self):
        logging.config.fileConfig('logging.conf')
        self.logr = logging.getLogger('root')

在另一个模块中,只需导入配置。

from log_conf import Logger

Logger.logr.info("Hello World")

这是一个简单有效的单例日志模式。

实际上,每个记录器都是父程序包记录器的子程序(即package.subpackage.modulepackage.subpackage)继承配置,所以您只需配置根记录器。这可以通过^{}(您自己的记录器配置)或^{}(设置根记录器)来实现。安装程序登录您的输入模块(__main__.py)或任何您想运行的程序,例如main_script.py__init__.py也可以)

使用basicConfig:

# package/__main__.py
import logging
import sys

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

使用文件配置:

# 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!")

有关详细信息,请参见Advanced Logging Tutorial

相关问题 更多 >

    热门问题