Python 其中是logging.config.dictConfig的完整示例?

Python 其中是logging.config.dictConfig的完整示例?,python,logging,python-logging,Python,Logging,Python Logging,我想使用,但文档有点抽象。我在哪里可以找到一个具体的、可复制+粘贴的、与dictConfig一起使用的词典示例?在这里如何!相应的文档参考是 用法: import logging.config # Run once at startup: logging.config.dictConfig(LOGGING_CONFIG) # Include in each module: log = logging.getLogger(__name__) log.debug("Logging is

我想使用,但文档有点抽象。我在哪里可以找到一个具体的、可复制+粘贴的、与dictConfig一起使用的词典示例?

在这里如何!相应的文档参考是

用法:

import logging.config

# Run once at startup:
logging.config.dictConfig(LOGGING_CONFIG)

# Include in each module:
log = logging.getLogger(__name__)
log.debug("Logging is configured.")
如果您看到来自第三方软件包的日志过多,请确保在导入第三方软件包之前使用
logging.config.dictConfig(logging\u config)
运行此配置


< >使用日志过滤器添加每个自定义消息到每个日志消息中,考虑.< /P> < P>所接受的答案是好的!但如果一个人可以从不那么复杂的事情开始呢?日志模块是非常强大的东西,文档有点难以理解,特别是对于新手来说。但在开始时,您不需要配置格式化程序和处理程序。当你弄清楚你想要什么时,你可以添加它

例如:

import logging.config

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'loggers': {
        '': {
            'level': 'INFO',
        },
        'another.module': {
            'level': 'DEBUG',
        },
    }
}

logging.config.dictConfig(DEFAULT_LOGGING)

logging.info('Hello, log')
我在下面找到了默认配置,希望能有所帮助

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[%(server_time)s] %(message)s',
        }
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}

流处理程序、文件处理程序、旋转文件处理程序和SMTP处理程序的示例

from logging.config import dictConfig

LOGGING_CONFIG = {
    'version': 1,
    'loggers': {
        '': {  # root logger
            'level': 'NOTSET',
            'handlers': ['debug_console_handler', 'info_rotating_file_handler', 'error_file_handler', 'critical_mail_handler'],
        },
        'my.package': { 
            'level': 'WARNING',
            'propagate': False,
            'handlers': ['info_rotating_file_handler', 'error_file_handler' ],
        },
    },
    'handlers': {
        'debug_console_handler': {
            'level': 'DEBUG',
            'formatter': 'info',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',
        },
        'info_rotating_file_handler': {
            'level': 'INFO',
            'formatter': 'info',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'info.log',
            'mode': 'a',
            'maxBytes': 1048576,
            'backupCount': 10
        },
        'error_file_handler': {
            'level': 'WARNING',
            'formatter': 'error',
            'class': 'logging.FileHandler',
            'filename': 'error.log',
            'mode': 'a',
        },
        'critical_mail_handler': {
            'level': 'CRITICAL',
            'formatter': 'error',
            'class': 'logging.handlers.SMTPHandler',
            'mailhost' : 'localhost',
            'fromaddr': 'monitoring@domain.com',
            'toaddrs': ['dev@domain.com', 'qa@domain.com'],
            'subject': 'Critical error with application name'
        }
    },
    'formatters': {
        'info': {
            'format': '%(asctime)s-%(levelname)s-%(name)s::%(module)s|%(lineno)s:: %(message)s'
        },
        'error': {
            'format': '%(asctime)s-%(levelname)s-%(name)s-%(process)d::%(module)s|%(lineno)s:: %(message)s'
        },
    },

}

dictConfig(LOGGING_CONFIG)

这里有一个更新的示例,说明如何在中声明logging.config.dictConfig()。从该cookbook链接向上滚动查看dictConfig()的用法

下面是一个使用StreamHandler和定制的and来记录stdout和“logs”子目录的示例用例

  • 导入模块并建立到“logs”子目录的跨平台绝对路径

    从os.path导入abspath、dirname、join
    导入日志记录
    从logging.config导入dictConfig
    base_dir=abspath(dirname(_文件__;))
    logs\u target=join(base\u dir+“\logs”,“python\u logs.log”)
    
  • 根据文档建立模式

    日志记录\u模式={
    #始终为1。模式版本控制可能会添加到日志记录的未来版本中
    “版本”:1,
    #“格式化程序名称”:{formatter Config Dict}
    “格式化程序”:{
    #格式化程序名称
    “标准”:{
    #类始终为“logging.Formatter”
    “类”:“logging.Formatter”,
    #可选:日志输出格式
    “格式”:“%(asctime)s\t%(levelname)s\t%(文件名)s\t%(消息)s”,
    #可选:asctime格式
    datefmt:“%d%b%y%H:%M:%S”
    }
    },
    #处理程序使用上面声明的格式化程序名称
    “处理程序”:{
    #处理程序名称
    “控制台”:{
    #logger.config()和logging.config.dictConfig()的混合类
    #记录器类特定的关键字参数(KWARG)在此处传递。
    “类”:“logging.StreamHandler”,
    #这是上面声明的格式化程序名称
    “格式化程序”:“标准”,
    “级别”:“信息”,
    #默认值是stderr
    “流”:ext://sys.stdout"
    },
    #与上面的StreamHandler示例相同,但具有不同的
    #特定于处理程序的KWARG。
    “文件”:{
    “类”:“logging.handlers.RotatingFileHandler”,
    “格式化程序”:“标准”,
    “级别”:“信息”,
    “文件名”:日志\u目标,
    “模式”:“a”,
    “编码”:“utf-8”,
    “最大字节数”:500000,
    “备份数量”:4
    }
    },
    #记录器使用上面声明的处理程序名称
    “伐木工人”:{
    “uuu main”:{#如果uuuu name_uuuuu==”uuuuu main_uuuuu“
    #即使使用了一个处理程序,也要使用列表
    “处理程序”:[“控制台”,“文件”],
    “级别”:“信息”,
    “传播”:假
    }
    },
    #只是根记录器的独立kwarg
    “根”:{
    “级别”:“信息”,
    “处理程序”:[“文件”]
    }
    }
    
  • 使用字典模式配置
    日志记录

    dictConfig(日志记录模式)
    
  • 尝试一些测试用例,看看是否一切正常

    如果名称=“\uuuuu main\uuuuuuuu”:
    logging.info(“测试信息日志条目”)
    logging.warning(“测试警告日志条目”)
    

  • 在字典的顶层有一个指定
    记录器的替代位置。如中所述,当两者都存在时,它优先于
    ['loggers'][''']
    ,但在我看来,
    ['loggers']['']
    更符合逻辑。另请参见讨论python logging.config文档中所有这些简洁、漂亮的YAML代码片段都无法直接读取。真糟糕,这不是django特有的吗?如果我正在使用一个不同的框架(烧瓶、瓶子等),或者甚至没有在web应用程序上工作,那该怎么办?使用
    'disable\u existing\u loggers'(禁用现有的\u loggers):False
    感觉像是一个骗局,因为您可能没有对它进行整体配置,但可能会重用已有的东西。。如果将其设置为
    True
    ,则我似乎没有得到任何输出。可恢复的错误如何?错误不应出现在标准输出中。它只用于程序输出。至少在我的例子中,这是一个更相关/有用的例子。正是最后一次
    logging.info('Hello,log')
    让我觉得很顺心。文档中的混乱之处在于,使用dictConfig,我们不再需要执行
    getLogger
    或任何这些操作。@Theothe您能解释一下空键
    '':{'level':'INFO'…
    ,以及为什么没有它它它就不能工作吗(例如,当将空白值更改为一个有效值,如<代码>标准<代码> @ MikWielsMs:尽管如此,仍然可以调用<代码> GETROGGER()。
    如果需要多个具有不同名称的记录器。这些记录器中的每一个都从根记录器继承配置。@MikeWilliamson
    getLogger
    始终是可选的。当直接使用
    logging.info()方法时,使用根记录器,而使用
    getLogger()
    您可以有不同的记录器,具有不同的名称和级别。这个示例很好,但我认为,为了突出公认的答案,需要进行一些解释
    from logging.config import dictConfig
    
    LOGGING_CONFIG = {
        'version': 1,
        'loggers': {
            '': {  # root logger
                'level': 'NOTSET',
                'handlers': ['debug_console_handler', 'info_rotating_file_handler', 'error_file_handler', 'critical_mail_handler'],
            },
            'my.package': { 
                'level': 'WARNING',
                'propagate': False,
                'handlers': ['info_rotating_file_handler', 'error_file_handler' ],
            },
        },
        'handlers': {
            'debug_console_handler': {
                'level': 'DEBUG',
                'formatter': 'info',
                'class': 'logging.StreamHandler',
                'stream': 'ext://sys.stdout',
            },
            'info_rotating_file_handler': {
                'level': 'INFO',
                'formatter': 'info',
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': 'info.log',
                'mode': 'a',
                'maxBytes': 1048576,
                'backupCount': 10
            },
            'error_file_handler': {
                'level': 'WARNING',
                'formatter': 'error',
                'class': 'logging.FileHandler',
                'filename': 'error.log',
                'mode': 'a',
            },
            'critical_mail_handler': {
                'level': 'CRITICAL',
                'formatter': 'error',
                'class': 'logging.handlers.SMTPHandler',
                'mailhost' : 'localhost',
                'fromaddr': 'monitoring@domain.com',
                'toaddrs': ['dev@domain.com', 'qa@domain.com'],
                'subject': 'Critical error with application name'
            }
        },
        'formatters': {
            'info': {
                'format': '%(asctime)s-%(levelname)s-%(name)s::%(module)s|%(lineno)s:: %(message)s'
            },
            'error': {
                'format': '%(asctime)s-%(levelname)s-%(name)s-%(process)d::%(module)s|%(lineno)s:: %(message)s'
            },
        },
    
    }
    
    dictConfig(LOGGING_CONFIG)