Reputation: 837
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 ?
Upvotes: 2
Views: 948
Reputation: 11
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}')
Upvotes: 1