【问题标题】:Problem with Python logging RotatingFileHandler in Django websiteDjango网站中Python记录RotatingFileHandler的问题
【发布时间】:2011-03-20 04:34:54
【问题描述】:

我有一个 django 驱动的网站,我使用标准日志记录模块来跟踪网络活动。

日志是通过 RotatingFileHandler 完成的,它配置了 10 个日志文件,每个 1000000 字节。日志系统工作正常,但这是我得到的日志文件:

-rw-r--r-- 1 apache      apache          83 Jul 23 13:30 hr.log
-rw-r--r-- 1 apache      apache      446276 Jul 23 13:03 hr.log.1
-rw-r--r-- 1 apache      apache      999910 Jul 23 06:00 hr.log.10
-rw-r--r-- 1 apache      apache         415 Jul 23 16:24 hr.log.2
-rw-r--r-- 1 apache      apache      479636 Jul 23 16:03 hr.log.3
-rw-r--r-- 1 apache      apache         710 Jul 23 15:30 hr.log.4
-rw-r--r-- 1 apache      apache      892179 Jul 23 15:03 hr.log.5
-rw-r--r-- 1 apache      apache         166 Jul 23 14:30 hr.log.6
-rw-r--r-- 1 apache      apache      890769 Jul 23 14:03 hr.log.7
-rw-r--r-- 1 apache      apache      999977 Jul 23 12:30 hr.log.8
-rw-r--r-- 1 apache      apache      999961 Jul 23 08:01 hr.log.9

如您所见,这是一团糟。最后的日志已写入文件 hr.log.2(7 月 23 日 16:24)而不是 hr.log,logging documentation 声明:

[...]例如,如果 backupCount 为 5,基本文件名为 app.log,您将获得 app.log、app.log.1、app.log.2,最多app.log.5. 写入的文件始终是 app.log。当这个文件被填满后关闭并重命名为app.log.1,如果存在app.log.1、app.log.2等文件,则重命名为app.log.2、app.log.1、app.log.2等文件。 log.3 等。

我做错了什么?


我的日志配置文件是:

logger.conf:

[loggers]
keys=root

[handlers]
keys=fileHandler

[formatters]
keys=simple

#--------------------------------------------------------------------
# Formatters
[formatter_simple]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

#--------------------------------------------------------------------
# Handlers
[handler_fileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=simple
args=("/data/django/hr/hr.log",'a',1000000,10)

#--------------------------------------------------------------------
# Loggers
[logger_root]
level=DEBUG
handlers=fileHandler

而我设置日志系统的python模块是:

logger.py

import os, logging

# Load config file
logger_config_file = \
    os.path.join(os.path.abspath(os.path.dirname(__file__)), 'logger.conf')
logging.config.fileConfig(logger_config_file)

# Create logger
logger = logging.getLogger('hr_Logger')

# Log start message
logger.info("Logging system started")

然后,在我的views.py 顶部我有:

import logging
from hr import logger

log = logging.getLogger('hr.views')
log.info('Load hr.views')

[...]

【问题讨论】:

  • 我用你的代码在本地尝试了一个设置,它工作正常。我不禁注意到时间戳大多是:30 和:03。尤其是从 14:03 开始​​,日志文件看起来好像被轮换到了应用程序之外。一个想法:您确定这是唯一配置的日志记录吗?看起来有点像您有一些其他日志代码保持打开的文件句柄。当应用程序启动时,另一个句柄指向 hr.log,从那时起它被旋转到 hr.2。
  • 所以...您不是说日志系统已损坏,只是时间戳已更改?日志文件是否以正确的顺序轮换?我刚刚通过相同的方法检查了旋转日志上的时间戳,它们的顺序正确。我没有任何正在处理日志的日志处理。看起来您可能有一个可能涉及文件的周期性任务?
  • @Kekoa 正如你所说,日志系统没有损坏,只是没有按预期工作。不幸的是,我不再从事该项目,也无法测试任何可能的建议。谢谢。

标签: python django logging


【解决方案1】:

谷歌给出了这个答案:

http://bytes.com/topic/python/answers/643884-rotatingfilehandler-bugs-errors-general-logging-question#post2552392

可能是您有多个进程在运行记录器吗?也许多个应用程序记录到同一个文件?

【讨论】:

    【解决方案2】:

    当您的代码运行多个进程时,我发现了这种行为。

    很遗憾,没有完美的选择。

    您可以合并的一些想法是:

    • 使用 WatchedFileHandler(2.6 中的新功能)并使用外部程序作为 logrotate 进行轮换
    • 使用 syslog 或其他日志聚合服务器
    • 使用 python 日志聚合sentry - 这对 django 尤其有用,因为您不仅可以记录日志消息,还可以记录带有完整堆栈跟踪和 404 的异常。

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 2014-02-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 2022-06-11
        • 1970-01-01
        相关资源
        最近更新 更多