Django网站中Python logging RotatingFileHandler的问题

12 投票
3 回答
7009 浏览
提问于 2025-04-16 01:44

我有一个用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。而且日志文档中说明:

[...]例如,如果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.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')

[...]

3 个回答

0

谷歌找到了这个答案:

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

你有没有想过,可能有多个进程在同时使用这个日志记录器?也许有多个应用程序在往同一个文件里写日志?

6
8

我发现当你的代码同时运行多个进程时,会出现这种情况。

不幸的是,没有完美的解决方案。

不过,你可以考虑以下一些方法:

  • 使用 WatchedFileHandler(在 2.6 版本中新增),并通过外部程序像 logrotate 来进行日志轮换。
  • 使用 syslog 或其他日志聚合服务器。
  • 使用 Python 的日志聚合工具 sentry - 这对于 Django 特别有用,因为你不仅可以记录日志信息,还可以记录异常的完整堆栈跟踪和 404 错误。

撰写回答