编辑:
看起来其他人对 TimedRotatingFileHandler
也有类似的问题。
Why doesn't my TimedRotatingFileHandler rotate at midnight?
显然,除非日志中发生某些事件,否则日志不会轮换。有没有一种方法可以使用内置处理程序实现我想要的计划轮换功能,而无需创建自定义轮换器?
原帖:
我正在使用 TimedRotatingFileHandler
Python 的 logging
模块定期轮换我的日志。
我已经在 logging.conf 中为我的应用程序的记录器和处理程序指定了这样的配置:
[logger_worker]
level=DEBUG
propogate=0
qualname=worker
handlers=workerHandler
[handler_workerHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=standardFormatter
args=("/var/log/app/worker.log","M",1,30,None,False,False)
- 注意:出于测试目的,我已将处理程序配置为每分钟轮换一次日志,但理想情况下,日志将在每天午夜轮换一次。
在我的应用中,我正在创建这样的记录器:
logging.config.fileConfig("logging.conf")
log = logging.getLogger("worker")
log.debug('Hello world')
它没有像我预期的那样工作:
- 它没有轮换所有日志
- 它并没有像配置的那样每分钟旋转一次
观察日志目录的ls -l
输出:
-rw-r--r-- 1 root root 0 Apr 19 18:22 dpv.log
-rw-r----- 1 root root 5092 Apr 20 11:47 emperor.log
-rw-r--r-- 1 root root 88939 Apr 20 11:47 uwsgi.log
-rw-r--r-- 1 root root 494 Apr 20 11:46 worker.log
-rw-r--r-- 1 root root 45906 Apr 20 02:08 worker.log.2016-04-20_02-08
-rw-r--r-- 1 root root 494 Apr 20 11:34 worker.log.2016-04-20_11-34
-rw-r--r-- 1 root root 494 Apr 20 11:36 worker.log.2016-04-20_11-36
-rw-r--r-- 1 root root 494 Apr 20 11:44 worker.log.2016-04-20_11-44
我做错了什么?即使没有向日志中写入任何内容,是否可以按预定期限轮换日志?
最佳答案
TimedRotatingFileHandler
似乎没有您需要的功能。
您可以尝试使用以下功能在特定时间轮换日志文件。
def log_rollover(folder_path):
# folder_path: the absolute path to your log folder
today = str(datetime.date.today()).replace('-', '')
list_of_files = os.listdir(folder_path)
for log_file in list_of_files:
file_path = folder_path + '/' + log_file
if log_file.endswith('.log') and os.stat(file_path).st_size > 0:
new_file_path = file_path.split('.')[-2] + '-' + today + '.log'
subprocess.check_call(['cp', file_path, new_file_path])
subprocess.check_call(['gzip', new_file_path])
subprocess.check_call(['cp', '/dev/null', file_path])
您还需要使用 cron 作业在特定时间运行该功能。
APScheduler
是一个不错的选择。例如,如果您想在凌晨 3 点运行 cron 作业,您可以使用:
folderPath = '/var/log/app' # The path to your log folder
scheduler = BlockingScheduler()
scheduler.add_job(log_rollover, trigger='cron', args=[folderPath], hour=3, minute=0)
scheduler.start()
不要忘记为 APScheduler
设置时区。
关于Python 计划日志轮转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36749401/