我正在尝试使用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),并使用标准日志格式(不是我指定的格式化程序)。我是否错误地配置了日志记录?
答案 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.stdout
或sys.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
路径。希望有所帮助。