背景

我有一个Apache服务的Django站点,在自己的虚拟主机中设置并使用mod_wsgi .

我希望将与此虚拟主机关联的所有错误记录到单个文件中 .

目前,一些错误正在发送到Apache的默认错误日志,而其他错误正在发送到我在虚拟主机中定义的错误 .

我很确定我已经将Django设置为通过我的Django设置中配置的 logging.StreamHandler 实例将 WARNERRORCRITICAL 错误传送到 sys.stderr . 我认为mod_wsgi将它传递给Apache,后者根据适用的 ErrorLogErrorLogFormatLogLevel 指令记录它 .

问题

  • 哪些设置/情况会导致错误转到另一个日志?

  • 是否可以统一我提供的各种错误?

  • 在哪里可以记录哪些错误有任何限制?

错误日志示例

/ var / log / apache2 / mysite_error.log

(由于在Django设置文件中为默认的Django Logger 有目的地设置了无效的日志级别“foo”而导致 . )

[Wed Aug 09 19:48:31.049028 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828] mod_wsgi (pid=30894): Target WSGI script '/home/myuser/mysite/mysite/mysite.wsgi' cannot be loaded as Python module.
[Wed Aug 09 19:48:31.049050 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828] mod_wsgi (pid=30894): Exception occurred processing WSGI script '/home/myuser/mysite/mysite/mysite.wsgi'.
[Wed Aug 09 19:48:31.049063 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828] Traceback (most recent call last):
[Wed Aug 09 19:48:31.049075 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]   File "/home/myuser/mysite/mysite/mysite.wsgi", line 18, in <module>
[Wed Aug 09 19:48:31.049112 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]     application = get_wsgi_application()
[Wed Aug 09 19:48:31.049119 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]   File "/home/myuser/mysite/venv/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Wed Aug 09 19:48:31.049140 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]     django.setup()
[Wed Aug 09 19:48:31.049153 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]   File "/home/myuser/mysite/venv/lib/python2.7/site-packages/django/__init__.py", line 17, in setup
[Wed Aug 09 19:48:31.049172 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]     configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
[Wed Aug 09 19:48:31.049177 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]   File "/home/myuser/mysite/venv/lib/python2.7/site-packages/django/utils/log.py", line 86, in configure_logging
[Wed Aug 09 19:48:31.049212 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]     logging_config_func(logging_settings)
[Wed Aug 09 19:48:31.049217 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]   File "/usr/lib/python2.7/logging/config.py", line 794, in dictConfig
[Wed Aug 09 19:48:31.049339 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]     dictConfigClass(config).configure()
[Wed Aug 09 19:48:31.049344 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]   File "/usr/lib/python2.7/logging/config.py", line 627, in configure
[Wed Aug 09 19:48:31.049392 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828]     '%r: %s' % (name, e))
[Wed Aug 09 19:48:31.049416 2017] [:error] [pid 30894:tid 140490808121088] [client 129.112.115.40:32828] ValueError: Unable to configure logger 'django': Unknown level: 'foo'

/ var / log / apache2 / error.log

(通过发出GET请求来查询数据库中不存在的记录 . )

[Wed Aug 09 19:45:56.500731 2017] [:error] [pid 30718:tid 140490808121088] ERROR 2017-08-09 19:45:56,500 base:256 handle_uncaught_exception 30718 140490808121088 Internal Server Error: /fooview
[Wed Aug 09 19:45:56.500744 2017] [:error] [pid 30718:tid 140490808121088] Traceback (most recent call last):
[Wed Aug 09 19:45:56.500746 2017] [:error] [pid 30718:tid 140490808121088]   File "/home/myuser/mysite/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 132, in get_response
[Wed Aug 09 19:45:56.500748 2017] [:error] [pid 30718:tid 140490808121088]     response = wrapped_callback(request, *callback_args, **callback_kwargs)
[Wed Aug 09 19:45:56.500749 2017] [:error] [pid 30718:tid 140490808121088]   File "/home/myuser/mysite/rtls/views.py", line 55, in fooview
[Wed Aug 09 19:45:56.500751 2017] [:error] [pid 30718:tid 140490808121088]     Node.objects.get(pk=-1)
[Wed Aug 09 19:45:56.500752 2017] [:error] [pid 30718:tid 140490808121088]   File "/home/myuser/mysite/venv/lib/python2.7/site-packages/django/db/models/manager.py", line 127, in manager_method
[Wed Aug 09 19:45:56.500754 2017] [:error] [pid 30718:tid 140490808121088]     return getattr(self.get_queryset(), name)(*args, **kwargs)
[Wed Aug 09 19:45:56.500755 2017] [:error] [pid 30718:tid 140490808121088]   File "/home/myuser/mysite/venv/lib/python2.7/site-packages/django/db/models/query.py", line 334, in get
[Wed Aug 09 19:45:56.500756 2017] [:error] [pid 30718:tid 140490808121088]     self.model._meta.object_name
[Wed Aug 09 19:45:56.500758 2017] [:error] [pid 30718:tid 140490808121088] DoesNotExist: Node matching query does not exist.

此外,如果我使用 logger.error('some error message') 手动进行日志记录调用,它也会显示在此处 - 而不是像我期望的那样在虚拟主机的错误日志中 .

程序版本信息

  • Apache / 2.4.7(Ubuntu)使用mpm_worker( apache2ctl -V

  • Django / 1.8.14( pip freeze

  • mod_wsgi / 3.4(this的最后一个方法)

  • Python / 2.7.6(来自主Apache的启动日志 error.log

配置和代码的相关部分

Apache

/ etc / apache2 / apache2.conf

ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel error

# ... stuff ...

WSGIRestrictStdout On

/ etc / apache2 / sites-available / mysite.conf

<VirtualHost *:80>
    # ... stuff ...

    ErrorLog ${APACHE_LOG_DIR}/mysite_error.log
    LogLevel warn

    #serving wsgi script
    WSGIScriptAlias / /home/myuser/mysite/mysite/mysite.wsgi
    <Directory /home/myuser/mysite/mysite>
        <Files mysite.wsgi>
            Require all granted
        </Files>
    </Directory>

    # ... stuff ...
</VirtualHost>

Django

/ home / myuser / mysite / mysite / initial_settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s:%(lineno)s %(funcName)s %(process)d %(thread)d %(message)s'
        },
        # ... other formatters ...
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
        # ... other handlers ...
    }
}

/ home / myuser / mysite / mysite / deployment.py

from initial_settings import LOGGING

LOGGING['loggers']['django'] = {
    'handlers': ['console'],
    'level': 'WARN',
    'propagate': True,
}

/ home / myuser / mysite / mysite / settings.py

from deployment import LOGGING

/ home / myuser / mysite / mysite / mysite.wsgi

(mod_wsgi守护进程模式和python-home指令即将到来但尚未合并,很抱歉触发Graham)

import os
import sys
activate_this_file = "/home/myuser/mysite/venv/bin/activate_this.py"
execfile(activate_this_file, dict(__file__=activate_this_file))

path = '/home/myuser/mysite'
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

# needed for upgrade django >=1.7
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()