簡體   English   中英

日志記錄刪除/檢查/修改由 fileConfig() 配置的處理程序

[英]logging remove / inspect / modify handlers configured by fileConfig()

如何使用 fileConfig() 函數刪除/檢查/修改為我的記錄器配置的處理程序?

對於刪除有 Logger.removeHandler(hdlr) 方法,但是如果它是從文件配置的,我如何首先獲取處理程序?

logger.handlers包含一個包含記錄器所有處理程序的列表。

此代碼將打印所有記錄器以及每個記錄器的處理程序

for k,v in  logging.Logger.manager.loggerDict.items()  :
        print('+ [%s] {%s} ' % (str.ljust( k, 20)  , str(v.__class__)[8:-2]) ) 
        if not isinstance(v, logging.PlaceHolder):
            for h in v.handlers:
                print('     +++',str(h.__class__)[8:-2] )

這將打印出系統中的記錄器和處理程序,包括它們的狀態和級別。

這將幫助您調試日志記錄問題

output:
+ [root                ] {logging.RootLogger} {DEBUG} 
-------------------------
   -name=root
   -handlers=[<logging.FileHandler object at 0x7fc599585390>, <logging.StreamHandler object at 0x7fc599585550>]
   -filters=[]
   -propagate=True
   -level=10
   -disabled=False
   -parent=None
     +++logging.FileHandler {NOTSET}
   -stream=<_io.TextIOWrapper name='/dev/logs/myapp.log' mode='w' encoding='UTF-8'>
   -mode=w
   -filters=[]
   -encoding=None
   -baseFilename=/home/dev/logs/myapp.log
   -level=0
   -lock=<unlocked _thread.RLock object owner=0 count=0 at 0x7fc5a85a4240>
   -delay=False
   -_name=None
   -formatter=<logging.Formatter object at 0x7fc599585358>
     +++logging.StreamHandler {DEBUG}
   -lock=<unlocked _thread.RLock object owner=0 count=0 at 0x7fc5a85a4210>
   -filters=[]
   -stream=<ipykernel.iostream.OutStream object at 0x7fc5aa6abb00>
   -level=10
   -_name=None
   -formatter=<logging.Formatter object at 0x7fc5995853c8>
+ [PathFinder          ] {logging.Logger} {NOTSET} 
-------------------------
   -name=PathFinder
   -handlers=[]
   -filters=[]
   -manager=<logging.Manager object at 0x7fc5b09757f0>
   -propagate=True
   -level=0
   -disabled=False
   -parent=<logging.RootLogger object at 0x7fc5b09757b8>

@Mickey-Perlstein 的答案正是我要找的,但清單似乎來自比提供的代碼更完整的版本。
這段代碼更粗糙,但對我的使用和理解至關重要,包括根記錄器

import logging

def listloggers():
    rootlogger = logging.getLogger()
    print(rootlogger)
    for h in rootlogger.handlers:
        print('     %s' % h)

    for nm, lgr in logging.Logger.manager.loggerDict.items():
        print('+ [%-20s] %s ' % (nm, lgr))
        if not isinstance(lgr, logging.PlaceHolder):
            for h in lgr.handlers:
                print('     %s' % h)

輸出:

<RootLogger root (DEBUG)>
     <TimedRotatingFileHandler /path/to/myapp.log (DEBUG)>
     <StreamHandler <stdout> (DEBUG)>
+ [concurrent.futures  ] <Logger concurrent.futures (DEBUG)> 
+ [concurrent          ] <logging.PlaceHolder object at 0x7f72f624eba8> 
+ [asyncio             ] <Logger asyncio (DEBUG)> 
+ [myapp               ] <Logger myapp (DEBUG)> 
+ [flask.app           ] <Logger flask.app (DEBUG)> 
+ [flask               ] <Logger flask (DEBUG)> 
+ [werkzeug            ] <Logger werkzeug (ERROR)> 

另一種方法可能是使用加載到字典中的 JSON 或 YAML 配置文件,然后您可以在將其傳遞給 logger.config 之前查看/操作該文件。

import yaml
import logging.config

with open (LOG_CONFIG, 'rt') as f:
   config=yaml.safe_load(f)
   config['handlers']['error_file_handler']['filename']='foo'
logging.config.dictConfig(config)

重新刪除處理程序 - 如果它對任何人有幫助,我想刪除我創建的所有日志的所有處理程序(我正在學習 python 日志記錄)並想出了這個:

def log_close():
    # get all loggers
    loggers = [logging.getLogger(name) if 'your_app_name' in name else None for name in logging.root.manager.loggerDict]
    # for each valid logger remove all handlers
    for log in loggers:
        if log != None:
            while bool(len(log.handlers)):
                for handler in log.handlers:
                    log.removeHandler(handler)
# set up log
log = logging.getLogger('your_app_name')
log.setLevel('DEBUG')
log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
date_format = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(log_format, date_format)
log_filename = 'your_app_name.log'
log_write_mode = 'w+'
file_handler = logging.FileHandler(log_filename, log_write_mode)
file_handler.setFormatter(formatter)
log.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
log.addHandler(console_handler)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM