我有一个小python项目,具有以下结构 -
Project
-- pkg01
-- test01.py
-- pkg02
-- test02.py
-- logging.conf
Run Code Online (Sandbox Code Playgroud)
我计划使用默认日志记录模块将消息打印到stdout和日志文件.要使用日志记录模块,需要进行一些初始化 -
import logging.config
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('pyApp')
logger.info('testing')
Run Code Online (Sandbox Code Playgroud)
目前,我在开始记录消息之前在每个模块中执行此初始化.是否可以在一个地方只执行一次初始化,以便通过整个项目记录重复使用相同的设置?
从Python 2.7 的logginghowto(我的重点):
命名记录器时,一个好的习惯是在每个使用日志记录的模块中使用模块级记录器,命名如下:
logger = logging.getLogger(__name__)这意味着记录器名称跟踪包/模块的层次结构,并且从记录器名称中记录事件的地方就很明显了。
听起来像个好建议。
现在,本logging食谱提供了多个模块的示例,这些示例使用硬编码的记录器名称而不是__name__常量。在示例的“主模块”中,我们发现
logger = logging.getLogger('spam_application')
在“辅助模块”中
module_logger = logging.getLogger('spam_application.auxiliary')
我将此示例逐字复制到具有以下结构的package文件夹中:
cookbook-example
|- __init__.py
|- main_module.py
|- auxiliary_module.py
Run Code Online (Sandbox Code Playgroud)
这没有问题,可以从主模块和辅助模块产生预期的日志记录输出,但实际上是这样:
如果现在__name__按照logginghowto的建议,用常数替换硬编码的记录器名称,则菜谱示例将崩溃:我仅从主模块获取记录消息,而从辅助模块中获取不到任何消息。
我一定想念一些明显的东西。有什么想法我做错了吗?
注意:
有很多非常类似的问题和相关的答案,如:1,2,3,4,5,6,等等。但是,这些似乎都没有解决这个具体问题。
- 编辑 -
这是一个基于Cookbook示例的最小示例,显式名称字符串替换为__name__。
main_module.py
import logging
import auxiliary_module
# create and configure main logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# create console …Run Code Online (Sandbox Code Playgroud) 我正在研究一个具有以下结构的小型python项目-
project
-- logs
-- project
__init.py__
classA.py
classB.py
utils.py
-- main.py
Run Code Online (Sandbox Code Playgroud)
我已经设置了日志记录配置__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 …Run Code Online (Sandbox Code Playgroud)