5

我有以下用于日志记录的处理程序配置:

    "handlers": {
      'system_file': {
        'level': 'DEBUG',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'filename': os.path.join(LOG_FOLDER, "all.log"),
        'formatter': 'verbose',
        'when': 'midnight',
        'backupCount': '30',
      }
   }

现在基于这个配置,我的日志应该在每个午夜轮换一次,即它应该创建日期明智的日志。

all.log文件中,所有内容都使用正确的时间戳正确记录,但是当轮换发生时,我看不到备份日志文件(前一天日志文件)中的所有日志。

例如:

假设今天是 2019-10-29,all.log 文件开始存储从 2019-10-29 00:00:00 到 2019-10-29 23:59:59 的所有日志。

第二天,即 2019 年 10 月 30 日(会发生轮换),当我去检查 all.log.2019-10-29 时,它包含从 2019 年 10 月 30 日 00:00:00 到 2019 年的日志- 10-30 01:00:00 和 all.log 文件从 00:00:00 开始存储 2019-10-30 的日志。所以基本上我所有的备份文件只包含第二天 00:00:00-01:00:00 的日志。

all.log 于 2019-10-30

[DEBUG 2019-10-30 00:00:07,463 cron.py:44] .....
[DEBUG 2019-10-30 00:00:11,692 cron.py:44] ....
[DEBUG 2019-10-30 00:00:13,679 cron.py:44] ....
.
.
[DEBUG 2019-10-30 00:00:55,692 cron.py:44] ....
[DEBUG 2019-10-30 00:59:58,679 cron.py:44] ....

SERVER SHUTS DOWN HERE AT 1AM AND STARTS STORING LOGS WHEN IT RESTARTS

[DEBUG 2019-10-30 07:00:02,692 cron.py:44] ....
[DEBUG 2019-10-30 07:00:04,679 cron.py:44] ....
.
.
*Till current time*

all.log.2019-10-29

[DEBUG 2019-10-30 00:00:07,463 cron.py:44] .....
[DEBUG 2019-10-30 00:00:11,692 cron.py:44] ....
[DEBUG 2019-10-30 00:00:13,679 cron.py:44] ....
.
.
.
[DEBUG 2019-10-30 00:00:52,463 cron.py:44] .....
[DEBUG 2019-10-30 00:00:55,692 cron.py:44] ....
[DEBUG 2019-10-30 00:59:58,679 cron.py:44] ....

all.log.2019-10-28

[DEBUG 2019-10-29 00:00:04,463 cron.py:44] .....
[DEBUG 2019-10-29 00:00:09,692 cron.py:44] ....
[DEBUG 2019-10-29 00:00:11,679 cron.py:44] ....
.
.
.
[DEBUG 2019-10-29 00:00:49,463 cron.py:44] .....
[DEBUG 2019-10-29 00:00:52,692 cron.py:44] ....
[DEBUG 2019-10-29 00:59:56,679 cron.py:44] ....

我正在使用按计划运行的服务器,服务器在凌晨 1 点关闭并在早上 7 点启动。这是我明白为什么会在凌晨 1 点发生这种奇怪行为的唯一原因,但我无法弄清楚为什么这会导致问题

任何帮助表示赞赏。

我正在使用 Django 1.9.7 和 Python 2.7.15

4

1 回答 1

5

正如这里和许多其他地方所提到的,您不能将此处理程序用于并发日志记录(在少数线程中运行的 Django 就是这种情况)。
潜在地,由于并发性,它们可以覆盖自己。

要从多个进程登录到单个目标,您可以使用以下方法之一:

  • 使用类似的东西ConcurrentLogHandler
  • 使用SysLogHandler(或NTEventLogHandler在 Windows 上)
  • 使用SocketHandler将日志发送到单独的进程以写入文件
  • 使用 aQueueHandler和 a ,如此multiprocessing.Queue所述。

如果您真的需要基于时间来执行此操作 - 您可以根据自己的条件重新定义ConcurrentRotatingFileHandler和方法。 这不是完美的方式,但它应该工作。_shouldRollover()

您还可以查看正在解决此问题的 GitHub 上的项目:

于 2019-11-05T21:00:47.133 回答