Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python定时日志旋转_Python_Logging_Rotation - Fatal编程技术网

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。谢谢。这似乎很有用。我要试一试。