Python定时日志旋转
编辑: 看起来其他人在Python定时日志旋转,python,logging,rotation,Python,Logging,Rotation,编辑: 看起来其他人在TimedRotatingFileHandler方面也有类似的问题 显然,除非日志中发生某些活动,否则日志不会旋转。有没有一种方法可以在不创建自定义旋转器的情况下使用内置处理程序实现所需的计划旋转功能 原职: 我正在使用Python的日志记录模块定期旋转日志 我已经在logging.conf中为我的应用程序的记录器和处理程序指定了如下配置: [logger_worker] level=DEBUG propogate=0 qualname=worker handlers
TimedRotatingFileHandler
方面也有类似的问题
显然,除非日志中发生某些活动,否则日志不会旋转。有没有一种方法可以在不创建自定义旋转器的情况下使用内置处理程序实现所需的计划旋转功能
原职: 我正在使用Python的
日志记录
模块定期旋转日志
我已经在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
设置时区 我遇到了同样的问题,并提出了不同的方法:
from datetime import datetime
import os
def rotate_log_if_new_day(self):
now = datetime.now().date()
file_date = datetime.fromtimestamp(os.path.getmtime("manager.err")).date()
if file_date != now:
self.logger.debug("Date changed with no events - rotating the log...")
self._errhandler.doRollover()
rotate\u log\u如果在管理器的更新周期(每15分钟一次)中调用了\u new\u day()
,这将确保日志在午夜后15分钟内旋转。如果日志已旋转(即:已记录错误或已进行手动旋转),则不会执行任何操作
最初我有一个防护装置来阻止
os.path…
调用,除非日期已更改,但是timeit()
显示了通过缓存当前日期(1.85μs vs 5.7μs)来验证无需执行任何操作而获得的微不足道的加速。您多久调用一次log.debug('Hello world')
?@julivico,该应用程序在许多地方都充满了日志。对于每个请求,应用程序都会在不同的地方记录大约100多行日志。所以我想这取决于在一段时间内有多少个请求。传入的请求可能是50/秒或1/小时,这是总变量,由用户决定。但是我仍然希望日志能够循环,即使没有活动。可能?如果没有活动,则日志记录也处于非活动状态。因此,日志将不会旋转。我想,你不会有每日轮换的问题。或者可以在Linux系统上使用<代码> LogStudio将考虑<代码> LogStudio作为备选方案…谢谢@julivico。谢谢。这似乎很有用。我要试一试。