python - 登录 Python/Django 未按预期工作

标签 python django logging python-logging django-logging

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

    "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

最佳答案

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

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

  • 使用类似 ConcurrentLogHandler 的东西
  • 使用 SysLogHandler (或 NTEventLogHandler 在 Windows 上)
  • 使用 SocketHandler它将日志发送到单独的进程以写入文件
  • 使用 QueueHandlermultiprocessing.Queue ,如概述 here .

  • 如果您确实需要使用基于时间的方式来执行此操作 - 您可以重新定义 ConcurrentRotatingFileHandler_shouldRollover()方法结合自己的情况。
    这不是完美的方式,但它应该有效。

    您也可以在 GitHub 上查看正在解决此问题的项目:
  • Preston-Landers/concurrent-log-handler - issue #23: Time based rotation
  • 关于python - 登录 Python/Django 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58624127/

    相关文章:

    python - 根据第二个数组在一个数组中查找项目

    python - 如何为相关对象创建自定义管理器?

    django - 如何编写一个 Django 查询,在作为 PostGres SQL 执行时执行日期数学运算?

    java - 为特定包设置 java Logger

    node.js - 在自动挂载的 CIFS 主机上处理 LOG 文件,该主机经常关闭

    Python递归向后打印列表中的项目

    python - 如何使用 Python 脚本输入内容

    python - 如何获取模型的名称或 Django 对象的内容类型?

    websphere - 如何在 Websphere 控制台的 Logs and Trace 中启用 JVM 日志

    Python - 通过终端与打开的程序对话