簡體   English   中英

如何通過 logging.config.dictConfig - FileHandler 指定 namer & rotator

[英]How to specify namer & rotator through logging.config.dictConfig - FileHandler

我正在尋找為logging.handler.TimedRotatingFileHandler指定名稱和旋轉器的正確方法。

下面是一個例子:

import logging

logger_config = {
    "version": 1,
        "handlers": {
            "file": {
                "class": "logging.handlers.TimedRotatingFileHandler",
                "filename": "logs",
                "when": "S",
                "interval": 8,
                "enconding": "utf-8",
                "namer": "?",
                "rotator": "?",
            },
        },
        "root": {
            "level": "INFO",
            "handlers": ["file"]
        }
}
dictConfig(logger_config)

任何的想法 ?

我使用配置字典中的自定義工廠解決了這種方法(該示例在控制台和當前目錄中的旋轉文件上生成日志記錄)

import logging
import logging.config
import logging.handlers
import os
import gzip


class MyRotatingFileHandler(logging.handlers.RotatingFileHandler):
    def __init__(self
               , filename
               , mode='a'
               , maxBytes=0
               , backupCount=0
               , encoding=None
               , delay=False
               , rotator_namer=None
               , rotator_fun=None
                ):
        super().__init__(filename, mode, maxBytes, backupCount, encoding, delay)
        if rotator_namer!= None:
            self.namer = rotator_namer
        if rotator_fun!=None:
            self.rotator = rotator_fun

def set_logging():
    def rotator_namer(name):
        return name + ".gz"

    def rotator_fun(source, dest):
        with open(source, "rb") as sf:
            data = sf.read()
            compressed = gzip.compress(data, 9)
            with open(dest, "wb") as df:
                df.write(compressed)
        os.remove(source)

    LOGGING = {
        'version': 1
      , 'formatters': {
            'default_formatter' : {
                'class': 'logging.Formatter'
              , 'format': '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s'
            }
        }
      , 'filters': { }
      , 'handlers': {
            'console': {
                'class': 'logging.StreamHandler'
              , 'formatter': 'default_formatter'
              , 'filters': []
            }
          , 'rotate': {
                '()': MyRotatingFileHandler
              , 'filename': 'aalog'
              , 'maxBytes': 40
              , 'backupCount': 4
              , 'rotator_namer': rotator_namer
              , 'rotator_fun': rotator_fun
              , 'formatter': 'default_formatter'
              , 'filters': []
            }
        }
      , 'root': {
            'level': 'DEBUG'
          , 'handlers': ['console', 'rotate']
        }
    }
    logging.config.dictConfig(LOGGING)
    return LOGGING

if __name__ == '__main__':
    set_logging()
    for n in range(40):
        logging.debug(f'Hello {n}')

暫無
暫無

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

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