Python日志记录 - 多个模块

时间:2017-12-02 12:48:45

标签: python logging config

我正在开发一个具有以下结构的小型python项目 -

project 
 -- logs
 -- project
    __init.py__
    classA.py
    classB.py
    utils.py
 -- main.py

我在项目下的__init.py__中设置了日志记录配置,如下所示:

import logging
from logging import StreamHandler
from logging.handlers import RotatingFileHandler

# Create the Logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

# Create the Handler for logging data to a file
logger_handler = RotatingFileHandler('logs\\mylog.log', maxBytes=1024, backupCount=5)
logger_handler.setLevel(logging.INFO)

#Create the Handler for logging data to console.
console_handler = StreamHandler()
console_handler.setLevel(logging.INFO)

# Create a Formatter for formatting the log messages
logger_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')

# Add the Formatter to the Handler
logger_handler.setFormatter(logger_formatter)
console_handler.setFormatter(logger_formatter)

# Add the Handler to the Logger
logger.addHandler(logger_handler)
logger.addHandler(console_handler)

以这种方式设置东西似乎是在包级别设置根记录器,而不是在整个项目级别。因此,main.py中的已记录语句不会出现在日志文件中,而两个类classAclassB以及utils.py中的所有日志语句都会被路由按预期进入控制台和日志文件。

如何设置日志记录以便我能够配置一次并在整个项目中使用它?我尝试将日志配置语句移动到main.py,但它似乎不起作用。

def setupLogging():
    # Create the Logger
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    ..etc..

def main():   
    setupLogging()

if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:1)

正如您第一次尝试的那样,仅为整个项目配置一次记录是正确的,而不是单独为每个包配置。

您做错了是您只为当前模块配置了记录器:

logger = logging.getLogger(__name__)

而不是那样,您想要配置根记录器:

root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)

# ...

root_logger.addHandler(logger_handler)
root_logger.addHandler(console_handler)

为根记录器完成的配置适用于未明确覆盖它的每个记录器。

然后你应该在实际记录时使用特定的记录器:

logger = logging.getLogger(__name__)

logger.warning("I am warning you about %s", something)