Python 计划日志轮转

标签 python logging rotation

编辑:

看起来其他人对 TimedRotatingFileHandler 也有类似的问题。

Python TimedRotatingFileHandler not rotating at midnight till something new is written to the log file. How to fix this?

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')

它没有像我预期的那样工作:

  1. 它没有轮换所有日志
  2. 它并没有像配置的那样每分钟旋转一次

观察日志目录的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/

相关文章:

python - 当收到 `sample_from_datasets` 警告时,TensorFlow 的 `DirectedInterleave selected an exhausted input` 是否仍然从数据集中采样?

python - 异构数据记录和分析

iOS View Controller 在旋转后移动

android - 用于旋转相机 Intent 捕获的图像的代码在 Android 中不起作用

python - git review 提示 requests.packages.urllib3 但包已安装

python - 无法使用pycharm导入wx

python - SocketHandler 的客户端/服务器日志记录模块超时

rotation - 如何在 Bullet Physics Engine 中对物体应用旋转?

python - 读取树莓派的GPIO引脚

java - 如何将java程序(log4j2)中的日志索引到elasticsearch中