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

问题描述:

我正在尝试使用Python logging模块为Django应用程序配置日志记录。我已经把配置如下代码位在我的Django项目的settings.py文件:如何在Django中配置Python日志记录模块?

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服务器日志(因为我使用的是Apache),并使用标准日志格式(而不是我指定的格式化程序)。我是否错误地配置了日志记录?

+0

我更新了我的答案。 – 2010-06-02 20:01:31

+0

如果您将删除最后一行,该怎么办?因此,只有在过程分叉之前,测井系统才会保持不动。只是一个想法。 – nkrkv 2010-06-03 15:25:51

一种反高潮的,但事实证明,有安装在已经陷入重写一个我建立了(它修改了根记录,出于某种原因自己的日志记录配置项目中的第三方应用程序 - - 对于Django应用程序来说不是非常值得的!)。删除了该代码,一切按预期工作。

+0

我一直在想出一个日志记录问题,这最终指向了我正确的方向 - 我从来没有关于第三方应用程序覆盖根记录器。谢谢! – 2013-07-23 11:13:29

我用这个成功(虽然它不旋转):

# 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' 
) 

我建议尝试绝对路径,太。

我猜测Apache在分叉进程时会停止记录。之后发生的事情,因为所有的文件描述符进行系统守护进程期间关闭,测井系统试图重新打开日志文件,据我了解使用相对文件路径:

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

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

+0

我试过一个绝对路径,但是这并没有改变任何东西。 – mipadi 2010-06-03 15:11:05

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

我不知道为什么你的日志信息是要在Apache日志,除非您已(在你的代码别的地方)加入了StreamHandler中到根记录器与sys.stdoutsys.stderr如流。你可能想打印出logging.getLogger().handlers只是为了看到它是你期望看到的。

+0

已经看到了。没有解决我遇到的问题。 – mipadi 2010-06-02 19:50:09