如何在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),并使用标准日志格式(而不是我指定的格式化程序)。我是否错误地配置了日志记录?
一种反高潮的,但事实证明,有安装在已经陷入重写一个我建立了(它修改了根记录,出于某种原因自己的日志记录配置项目中的第三方应用程序 - - 对于Django应用程序来说不是非常值得的!)。删除了该代码,一切按预期工作。
我一直在想出一个日志记录问题,这最终指向了我正确的方向 - 我从来没有关于第三方应用程序覆盖根记录器。谢谢! – 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
路径。希望有所帮助。
我试过一个绝对路径,但是这并没有改变任何东西。 – mipadi 2010-06-03 15:11:05
参见this other answer。请注意,settings.py通常会导入两次,所以您应该避免创建多个处理程序。更好的日志记录支持是在1.3(希望),但现在你应该确保如果你的设置代码被称为不止一次,没有不利影响。
我不知道为什么你的日志信息是要在Apache日志,除非您已(在你的代码别的地方)加入了StreamHandler中到根记录器与sys.stdout
或sys.stderr
如流。你可能想打印出logging.getLogger().handlers
只是为了看到它是你期望看到的。
已经看到了。没有解决我遇到的问题。 – mipadi 2010-06-02 19:50:09
我更新了我的答案。 – 2010-06-02 20:01:31
如果您将删除最后一行,该怎么办?因此,只有在过程分叉之前,测井系统才会保持不动。只是一个想法。 – nkrkv 2010-06-03 15:25:51