从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日志记录类,它可以作为记录配置的常用方法继承,但是从父级单独控制基类的日志记录级别.这类似于如何在多个模块中使用python日志记录.Vinay Sajip使用LogMixin 的答案非常接近.以下是我稍加修改的版本.
我的大多数类都继承了较小的类.例如:
filename:LogMixin.py
import logging, logging.config
import yaml
class LogMixin(object):
__loggerConfigured = False
@property
def logger(self):
if not self.__loggerConfigured:
with open('log_config.yaml', 'rt') as f:
config = yaml.load(f.read())
logging.config.dictConfig(config)
self.__loggerConfigured = True
name = '.'.join([self.__class__.__name__])
return logging.getLogger(name)
Run Code Online (Sandbox Code Playgroud)
文件名:Base.py
from LogMixin import LogMixin
class Base(LogMixin):
def __init__(self):
self.logger.debug("Debug Base")
def run_base(self):
self.logger.debug("Debug Running Base")
self.logger.info("Info Running Base")
if __name__ == '__main__':
my_base = Base()
my_base.run_base()
Run Code Online (Sandbox Code Playgroud)
filename:Parent.py
from Base import Base
class Parent(Base):
def __init__(self):
self.logger.debug("Debug Parent") …Run Code Online (Sandbox Code Playgroud)