我有一個類似的要求,可以在啓動時根據命令行選項強制執行日誌輪換,但是要使日誌文件按其常規計劃進行輪換。這是我的解決方案:
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
注:
這已被證實在RotatingFileHandler
如果maxBytes > 0
工作。
該方法尚未經過TimedRotatingFileHandler
的測試,但應該有效。
該方法無需保持對要旋轉的RotatingFileHandler
的引用;因此,在使用logging.config
配置日誌記錄時,可以輕鬆使用它。
+1對於實際的解決方案。不幸的是,這個解決方案需要知道添加了哪些訂單處理程序 - 即my_logger.handlers [0] vs my_logger.handlers [n]。有沒有一種優雅的方式來避免避免硬編碼的價值? – 2013-07-29 22:56:25
我很確定你可以調用handler.doRollover()。換句話說,在某處保持對它的引用。 – kylejmcintyre 2013-09-19 20:46:20