如何在Django中配置Python日志记录模块?

时间:2010-06-02 19:35:35

标签: python django logging

我正在尝试使用Python logging模块为Django应用配置日志记录。我在Django项目的settings.py文件中放置了以下一些配置代码:

import logging
import logging.handlers
import os
date_fmt = '%m/%d/%Y %H:%M:%S'
log_formatter = logging.Formatter(u'[%(asctime)s] %(levelname)-7s: %(message)s (%(filename)s:%(lineno)d)', datefmt=date_fmt)
log_dir = os.path.join(PROJECT_DIR, "var", "log", "my_app")
log_name = os.path.join(log_dir, "nyrb.log")
bytes = 1024 * 1024   # 1 MB
if not os.path.exists(log_dir):
  os.makedirs(log_dir)
handler = logging.handlers.RotatingFileHandler(log_name, maxBytes=bytes, backupCount=7)
handler.setFormatter(log_formatter)
handler.setLevel(logging.DEBUG)
logging.getLogger().setLevel(logging.DEBUG)
logging.getLogger().addHandler(handler)
logging.getLogger(__name__).info("Initialized logging subsystem")

在启动时,我在日志文件中收到一些与Django相关的消息以及“初始化日志记录子系统”,但随后所有日志消息最终都会转到Web服务器日志(/var/log/apache2/error.log ,因为我使用Apache),并使用标准日志格式(不是我指定的格式化程序)。我是否错误地配置了日志记录?

4 个答案:

答案 0 :(得分:3)

有点反高潮,但事实证明项目中安装了第三方应用程序,它有自己的日志配置,覆盖了我设置的应用程序(由于某些原因,它修改了根记录器 - 对于Django应用来说,不是非常犹太人!)。删除了该代码,一切都按预期工作。

答案 1 :(得分:2)

我成功地使用了它(虽然它没有旋转):

# in settings.py
import logging
logging.basicConfig(
    level = logging.DEBUG,
    format = '%(asctime)s %(levelname)s %(funcName)s %(lineno)d \
              \033[35m%(message)s\033[0m', 
    datefmt = '[%d/%b/%Y %H:%M:%S]',
    filename = '/tmp/my_django_app.log',
    filemode = 'a'
)

我建议尝试绝对路径。

答案 2 :(得分:2)

this other answer。请注意,settings.py通常会导入两次,因此您应该避免创建多个处理程序。更好的日志记录支持将在1.3(有希望)的Django中出现,但是现在你应该确保如果不止一次调用你的设置代码,就没有不利影响。

我不确定为什么您的已记录消息会转到Apache日志,除非您(代码中的其他位置)将StreamHandler添加到您的根记录器中sys.stdoutsys.stderr为流。您可能希望打印logging.getLogger().handlers只是为了看到它是您期望看到的。

答案 3 :(得分:0)

我想当Apache分叉进程时,日志记录会停止。发生这种情况之后,由于所有文件描述符在守护进程期间都被关闭,因此日志记录系统会尝试重新打开日志文件,据我所知,使用 relative 文件路径:

log_dir = os.path.join(PROJECT_DIR, "var", "log", "my_app")
log_name = os.path.join(log_dir, "nyrb.log")

但是当进程被守护进程时没有“当前目录”。尝试使用绝对log_dir路径。希望有所帮助。