我有以下设置:
- 根记录器可随时随地记录
- 我的程序员在启动后通过一个
CallbackHandler
的回调(例如数据库)添加了一个新的处理程序 - 我的模块中的命名记录器不会调用根记录器
Online Python Compiler<;-您需要 Select main.py才能在其中运行main.py
main.py
import logging
import logging.config
import MyLogger
from MyApp import MyApp
MyLogger.init()
_logger = logging.getLogger() # root
def main() :
_logger.error( "main - root logger" )
app = MyApp() # setup app and attach CallbackHandler to root logger
app.testLog() # call named logger - should call root logger & callback handler
if __name__ == "__main__" :
main()
MyLogger.py个
import logging
from logging import LogRecord
import logging.config
import os
from typing import Callable
LOG_PATH = "./logs"
LOGGING_CONFIG : dict = {
"version" : 1 ,
'formatters': {
'simple': {
'format': '%(name)s %(message)s'
},
},
"handlers" : {
"ConsoleHandler" : {
"class" : "logging.StreamHandler" ,
"formatter" : "simple" ,
} ,
} ,
"root" : {
"handlers" : [
"ConsoleHandler" ,
] ,
"level" : "DEBUG" ,
}
}
def init() :
os.makedirs( LOG_PATH , exist_ok = True )
logging.config.dictConfig( LOGGING_CONFIG )
class CallbackHandler( logging.Handler ) :
def __init__( self , level = logging.DEBUG , callback : Callable = None ) :
super().__init__( level )
self._callback = callback
def emit( self , record : LogRecord ) :
if self._callback is not None :
self._callback( record.name + " | " + record.msg )
MyApp.py个
import logging
from MyLogger import CallbackHandler
_logger = logging.getLogger( __name__ )
class MyApp :
def __init__( self ) :
rootLogger = logging.getLogger()
rootLogger.addHandler( CallbackHandler( callback = self.myCallback ) )
def myCallback( self , msg : str ) :
print( "CALLBACK: " + msg )
def testLog( self ) :
_logger.error( "MyApp.testLog() - named logger" )
这docs个人说,被命名的伐木者不继承父母的处理程序. 但是它们将它们的日志(log)消息传播到父/根记录器--该记录器附加了处理程序. 但是,它们不会被命名的记录器调用.
问题:100 is not called
(如果我删除MyApp.py: logging.getLogger()
中的__name__
,则引用根记录器并调用回调处理程序)
我该如何:
- 初始化根记录器
- 稍后在我的程序中,将一个定制处理程序附加到根记录器
- 在我的程序中使用命名记录器
- 将日志(log)从指定的记录器传播到根记录器
- 以便日志(log)使用定制的根记录器处理程序