我有以下设置:

  • 根记录器可随时随地记录
  • 我的程序员在启动后通过一个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__,则引用根记录器并调用回调处理程序)

我该如何:

  1. 初始化根记录器
  2. 稍后在我的程序中,将一个定制处理程序附加到根记录器
  3. 在我的程序中使用命名记录器
  4. 将日志(log)从指定的记录器传播到根记录器
  5. 以便日志(log)使用定制的根记录器处理程序

推荐答案

修复方法:在您的LOGGING_CONFIG词典中添加以下行:

"disable_existing_loggers" : False,

问题是,子记录器是在日志(log)记录获得其配置之前创建的,配置日志(log)记录时的默认行为是禁用现有的记录器.Link to the docs(这是该部分的最后一项).

Python相关问答推荐

正在设置字段.需要为假,因为错误列表索引必须是整数或切片,而不是字符串

如何确保Flask应用程序管理面板中的项目具有单击删除功能?

修剪Python框架中的尾随NaN值

如何计算部分聚合数据的统计数据

如何在Power Query中按名称和时间总和进行分组

"如果发生特定错误,返回值

使用Beautiful Soup获取第二个srcset属性

code _tkinter. Tcl错误:窗口路径名称错误.!按钮4"

如何使用bs 4从元素中提取文本

给定数据点,制定它们的关系

时间序列分解

带条件计算最小值

从numpy数组和参数创建收件箱

将图像拖到另一个图像

如何获取TFIDF Transformer中的值?

使用NeuralProphet绘制置信区间时出错

多处理队列在与Forking http.server一起使用时随机跳过项目

启用/禁用shiny 的自动重新加载

从Windows Python脚本在WSL上运行Linux应用程序

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值