Python子记录器应该向根记录器报告,而不是应用其自己的日志配置
正如这里提到的。当记录到子记录器时,它将把消息传递给其父记录器,其父记录器将把消息传递给根记录器。 现在考虑下面的例子Python子记录器应该向根记录器报告,而不是应用其自己的日志配置,python,logging,Python,Logging,正如这里提到的。当记录到子记录器时,它将把消息传递给其父记录器,其父记录器将把消息传递给根记录器。 现在考虑下面的例子 import logging import logging.handlers child_logger = logging.getLogger(__name__) f = logging.Formatter( fmt='%(asctime)s; %(name)s; % (filename)s:%(lineno)d:%(message)s', da
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的日志文件中
我很困惑。如中所示,记录器将日志记录传递给自己的处理程序和父记录器对象。尝试将处理程序添加到父记录器,您将看到日志记录也正在父记录器中处理。如中所示,记录器将日志记录传递给自己的处理程序和父记录器对象。尝试将处理程序添加到父记录器,您将看到日志记录也正在父记录器中处理。在这种情况下,您的“子记录器”是您的根记录器。如果您已经这样初始化了它:
logger = getLogger('root')
child_logger = getLogger('root.child')
child\u logger
是logger
的子项,定义如下:
该名称可能是一个以句点分隔的层次结构值,如foo.bar.baz(例如,它也可能只是普通的foo)。层次结构列表中较低的记录器是列表中较高记录器的子级。例如,给定一个名为foo的记录器,名为foo.bar、foo.bar.baz和foo.bam的记录器都是foo的后代。记录器名称层次结构类似于Python包层次结构,如果您使用推荐的构造logging.getLogger(\uuu name\uuu
)按模块组织记录器,则记录器名称层次结构与Python包层次结构相同。这是因为在模块中,\uuuuuu name\uuuuu
是Python包名称空间中模块的名称
如果您不想让孩子传播,可以设置=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\u logger.info(“info Message”)
不会将任何内容打印到debug\u logger的指定文件中,但是,如果root\u logger
的级别设置为info或debug,它会在其文件中打印出来。我将其用于调试日志记录,同时仍保留让日志记录器发出错误消息调用并将其打印到根日志的功能。在这种情况下,您的“子日志记录器”就是您的根日志记录器。如果您已经这样初始化了它:
logger = getLogger('root')
child_logger = getLogger('root.child')
child\u logger
是logger
的子项,定义如下:
该名称可能是一个以句点分隔的层次结构值,如foo.bar.baz(例如,它也可能只是普通的foo)。层次结构列表中较低的记录器是列表中较高记录器的子级。例如,给定一个名为foo的记录器,名为foo.bar、foo.bar.baz和foo.bam的记录器都是foo的后代。记录器名称层次结构类似于Python包层次结构,如果您使用推荐的构造logging.getLogger(\uuu name\uuu
)按模块组织记录器,则记录器名称层次结构与Python包层次结构相同。这是因为在模块中,\uuuuuu name\uuuuu
是Python包名称空间中模块的名称
如果您不想让孩子传播,可以设置=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\u logger.info(“info Message”)
不会将任何内容打印到debug\u logger的指定文件中,但是,如果root\u logger
的级别设置为info或debug,它会在其文件中打印出来。我将其用于调试日志记录,同时仍保留让日志记录器调用错误消息并将这些消息打印到根日志的功能。根日志记录器实际上不是根日志记录器。为此,您应该调用getLogger()
根记录器实际上不是根记录器。为此,您应该调用getLogger()