[英]How do I configure the Python logging module in Django?
我正在尝试使用Python logging
模块为Django应用程序配置日志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相关的消息以及“初始化日志子系统”,但是随后所有日志消息最终都进入了Web服务器日志( /var/log/apache2/error.log
(因为我使用的是Apache),并使用标准的日志格式(而不是我指定的格式化程序)。 我是否配置了错误的日志记录?
有点抗高潮,但事实证明,该项目中安装了一个第三方应用程序,该应用程序具有自己的日志记录配置,该配置取代了我设置的日志记录配置(出于某些原因,它修改了根记录器-不太符合犹太标准) Django应用!)。 删除了该代码,一切正常。
我成功地使用了它(尽管它不会旋转 ):
# 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'
)
我建议也尝试绝对路径。
看到其他答案 。 请注意,settings.py通常被导入两次,因此您应避免创建多个处理程序。 希望在1.3中为Django提供更好的日志记录支持,但是现在您应该确保如果多次调用设置代码,不会有不利影响。
我不确定为什么您的登录消息会进入Apache日志,除非您(在代码中的其他位置)将sys.stdout
或sys.stderr
作为流添加了StreamHandler到根记录器中。 您可能希望打印出logging.getLogger().handlers
只是为了查看它是您期望看到的。
我猜想日志将在Apache分叉进程时停止。 在那之后,由于所有文件描述符都在守护进程中关闭,因此日志记录系统会尝试重新打开日志文件,据我所知,它使用相对文件路径:
log_dir = os.path.join(PROJECT_DIR, "var", "log", "my_app")
log_name = os.path.join(log_dir, "nyrb.log")
但是,在守护进程后没有“当前目录”。 尝试使用绝对log_dir
路径。 希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.