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

2 投票
4 回答
4169 浏览
提问于 2025-04-15 23:28

我正在为一个Django应用配置日志记录,使用的是Python的logging模块。我把以下这段配置代码放在了我的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相关的消息,还有“初始化日志子系统”的提示,但之后所有的日志消息都被发送到了网络服务器的日志里(/var/log/apache2/error.log,因为我使用的是Apache),而且使用的是标准的日志格式(不是我指定的格式)。我是不是配置日志记录时出错了?

4 个回答

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

可以看看这个其他的回答。注意,settings.py 通常会被导入两次,所以你应该避免创建多个处理器。Django 在 1.3 版本中会有更好的日志支持(希望如此),但目前你需要确保如果你的设置代码被调用多次,不会产生不好的影响。

我不太明白为什么你的日志信息会出现在 Apache 日志里,除非你在代码的其他地方给根日志添加了一个 StreamHandler,并且把 sys.stdoutsys.stderr 作为流。你可以打印一下 logging.getLogger().handlers,看看是否是你预期的结果。

3

有点让人失望,但实际上项目里安装了一个第三方应用,它有自己的日志设置,结果把我设置的日志给覆盖了(它修改了根日志记录器,原因不明——对于一个Django应用来说,这可不太正常!)。把那段代码删掉后,一切都按预期工作了。

撰写回答