gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:25:27 25 4
gpt4 key购买 nike

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

    "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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com