简体   繁体   中英

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

I'm looking for the right way to specify namer & rotator for a logging.handler.TimedRotatingFileHandler .

Here is an example:

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)

Any idea ?

I solved this way using a custom factory in configuration dictionary (the example produces logging records on console and on rotating files in current directory)

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}')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM