У меня было аналогичное требование, чтобы иметь возможность принудительно чередовать журналы при запуске, основываясь на параметре командной строки, но в противном случае журналы могли вращаться по их обычному расписанию. Это было мое решение:
import logging
from logging.handlers import BaseRotatingHandler
from typing import Union
def rotate_logs(loggers: Union[str,list]=None, delimiter: str=','):
"""Rotate logs.
Args:
loggers: List of logger names as list object or as string,
separated by `delimiter`.
delimiter: Separator for logger names, if `loggers` is :obj:`str`.
Defaults to ``,`` (comma).
"""
# Convert loggers to list.
if isinstance(loggers, str):
loggers = [t.strip() for t in loggers.split(delimiter)]
handlers = []
root = logging.getLogger()
# Include root logger in dict.
ld = {'': root, **root.manager.loggerDict}
for k, v in ld.items():
if loggers is not None and k not in loggers:
continue
try:
for h in v.handlers:
if (isinstance(h, BaseRotatingHandler) and
h not in handlers):
handlers.append(h)
except AttributeError:
pass
for h in handlers:
h.doRollover()
if __name__ == '__main__':
pass
Примечания:
Это было проверено, чтобы работать, если maxBytes > 0
на RotatingFileHandler
.
Этот метод не был протестирован с TimedRotatingFileHandler
, но должен работать.
Этот метод устраняет необходимость сохранять ссылку на RotatingFileHandler
, который должен быть повернут; в результате его можно легко использовать при настройке ведения журнала с использованием logging.config
.