![](/img/trans.png)
[英]python logging with multiprocessing, root logger different in windows
[英]Python child logger should report back to root logger instead of applying its own logging configs
如此处提到https://stackoverflow.com/a/4150322/1526342 。 登录到子记录器时,它将消息传递给其父记录器,其父记录器会将消息传递给根记录器。 现在考虑以下示例
import logging
import logging.handlers
child_logger = logging.getLogger(__name__)
f = logging.Formatter(
fmt='%(asctime)s; %(name)s; % (filename)s:%(lineno)d:%(message)s',
datefmt="%Y-%m-%d %H:%M:%S")
handler = logging.handlers.RotatingFileHandler('/tmp/info.log',
encoding='utf8',
maxBytes=500000000,
backupCount=5)
handler.setFormatter(f)
child_logger.setLevel(logging.INFO)
child_logger.addHandler(handler)
child_logger.info('1 + 1 is %d', 1+1)
child_logger
应该已经报告回根记录器,而不是将输出打印到child_logger的日志文件中。
我糊涂了。
如该日志记录流程图所示,记录器将日志记录传递给自己的处理程序和父记录器对象。 尝试将处理程序添加到父记录器中,您还将看到日志记录也在其中被处理。
在这种情况下,您的“ child_logger”是您的根记录器。 如果您像这样初始化它:
logger = getLogger('root')
child_logger = getLogger('root.child')
child_logger
是logger
的子项,其定义如下:
该名称可能是用句点分隔的分层值,例如foo.bar.baz(例如,也可以是纯foo)。 层次结构列表中位于最下方的记录器是列表中较高处的记录器的子级。 例如,给定名称为foo的记录器,名称为foo.bar,foo.bar.baz和foo.bam的记录器都是foo的后代。 记录程序名称层次结构类似于Python包层次结构,如果您使用建议的构造logging.getLogger(
__name__
)在每个模块的基础上组织记录程序,则记录程序名称层次结构与Python包层次结构相同。 这是因为在模块中,__name__
是Python包命名空间中模块的名称。
如果您不希望孩子进行logger.propagate
,则可以设置logger.propagate
= False
。
此外,如果您只希望将某些级别写入子记录器文件(即仅调试),但又希望继续传播更高级别,则可以创建处理程序的子类,如我的此处所示:
from logging import DEBUG, INFO, WARN, ERROR, CRITICAL, handlers
class DebugRotatingFileHandler(handlers.RotatingFileHandler):
def __init__(self, filename, mode, maxBytes, backupCount, encoding, delay):
super(DebugRotatingFileHandler, self).__init__(
self, filename, mode, maxBytes, backupCount, encoding, delay)
def emit(self, record):
if record.levelno != DEBUG:
return
super(DebugRotatingFileHandler, self).emit(self, record)
(是的,我知道可以进行一些改进,这是旧代码。)
例如,执行debug_logger.info("Info Message")
不会将任何内容打印到debug_logger的指定文件,但是,如果root_logger
的级别设置为info或debug,它将在文件中打印出来。 我将其用于调试日志记录,同时仍保留使记录器进行错误消息调用并将其打印到根日志的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.