【问题标题】:Django Does Not Write Logs to FileDjango 不将日志写入文件
【发布时间】:2016-10-13 04:38:18
【问题描述】:

我在views.py 中有一个自定义的日志配置,如下所示:

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# Handlers
log_handlers = {
    "terminal": logging.StreamHandler(),
    "file_debug": logging.FileHandler("/var/log/eshot-api/{name}-{level}.log".format(name=__name__, level="DEBUG"), mode="w"),
    "file_error": logging.FileHandler("/var/log/eshot-api/{name}-{level}.log".format(name=__name__, level="ERROR"), mode="w")
}

log_handlers["terminal"].setLevel(logging.INFO)
log_handlers["file_debug"].setLevel(logging.DEBUG)
log_handlers["file_error"].setLevel(logging.ERROR)

# Formatters
log_formatters = {
    "terminal": logging.Formatter("[%(name)s]::[%(levelname)s]@[%(asctime)s]: %(message)s"),
    "file_debug": logging.Formatter("[%(levelname)s]@[%(asctime)s]: %(message)s"),
    "file_error": logging.Formatter("[%(asctime)s]: %(message)s")
}

for k, v in log_formatters.items():
    log_handlers[k].setFormatter(v)

我已经创建了一个/var/log/eshot-api 的目录,并授予了chmod 777 对该目录的权限,这样写入就不会有问题了。

我还创建了如下函数:

def initial_log(request, method):
    logger.debug("{ip} requested {path} with {kwargs} in {method} method".format(ip=ipaddr(request), path=request.get_full_path(), kwargs=str(dict(request.GET)), method=method))

method 参数是将“GET”或“POST”传递给此函数的字符串。

我把这个放在我所有get 函数ClassBasedView 的开头。但是,当我运行并刷新页面几次以生成一些日志并查看我的日志文件时,它们是空的。

而且,我想提一下,这是我自己电脑上的开发服务器。


环境

  • django 1.9.6
  • ubuntu 14.04
  • python 3.5.1

【问题讨论】:

标签: django python-3.x logging


【解决方案1】:

检查您的 settings.py 以获取 LOGGING = {...} 设置,并确保将 disable_existing_loggers 设置为 False

LOGGING = {
    ...
    'disable_existing_loggers': False,
    ..
}

或完全删除 LOGGING 设置。并向记录器添加处理程序:

logger.addHandler(log_handlers["file_debug"])

我也想advise you to configure LOGGING in your settings.py

完整的工作示例

urls.py:

from django.conf.urls import url
from .views import IndexView

urlpatterns = [
    url(r'^$', IndexView.as_view()),
]

views.py:

import logging
from django.http import HttpResponse
from django.views.generic import View

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# Handlers
log_handlers = {
    "terminal": logging.StreamHandler(),
    "file_debug": logging.FileHandler("/var/log/eshot-api/{name}-{level}.log".format(name=__name__, level="DEBUG"), mode="w"),
    "file_error": logging.FileHandler("/var/log/eshot-api/{name}-{level}.log".format(name=__name__, level="ERROR"), mode="w")
}

log_handlers["terminal"].setLevel(logging.INFO)
log_handlers["file_debug"].setLevel(logging.DEBUG)
log_handlers["file_error"].setLevel(logging.ERROR)

# Formatters
log_formatters = {
    "terminal": logging.Formatter("[%(name)s]::[%(levelname)s]@[%(asctime)s]: %(message)s"),
    "file_debug": logging.Formatter("[%(levelname)s]@[%(asctime)s]: %(message)s"),
    "file_error": logging.Formatter("[%(asctime)s]: %(message)s")
}

for k, v in log_formatters.items():
    log_handlers[k].setFormatter(v)

logger.addHandler(log_handlers['file_debug'])

class IndexView(View):
    def get(self, request):
        logger.debug("requested {path} with {kwargs} in method".format(path=request.get_full_path(), kwargs=str(dict(request.GET))))
        return HttpResponse('app:index')

settings.py

LOGGING = {
    'disable_existing_loggers': False,
}

【讨论】:

  • 感谢文档,我会参考的。然而,这并没有改变问题。日志仍然是空的。我会尝试文档的方式,如果一切顺利,那么我会接受这个答案为有效的。谢谢...
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 2018-02-03
  • 2015-11-06
  • 1970-01-01
  • 2012-01-16
相关资源
最近更新 更多