Django 日志记录在 apache 中不起作用。?

Django logging not working in apache.?

我用 DEBUG = False 配置了 django 日志记录和 运行 ./manage.py runserver,一切正常。但是,一旦我通过 URL 访问我的服务器,Apache 就会引发 500 错误,这是 error.log

的最后几行
ValueError: Unable to configure handler 'db_handler': [Errno 2] N
o such file or directory: '/logs/django_db.log'

这里是 settings.py 文件中声明 db_handler.

的片段
    #settings.py
    ...
    'db_handler': {
        'level':'DEBUG',
        'class':'logging.handlers.RotatingFileHandler',
        'filename': 'logs/django_db.log',
        'maxBytes': 1024*1024*5, # 5 MB
        'backupCount': 5,
        'formatter':'standard',
    },
    ...

我不确定我做错了什么。我还在包含 settings.py 的目录的父目录中创建了一个名为 logs 的目录,当我 ./manage.py runserver 它工作正常并在 logs 文件夹中创建文件。我很困惑。

您的 Apache 服务器似乎正在尝试创建此路径 /logs/django_db.log

我建议您设置 logs/django_db.log file 的绝对路径。

只需在路径上创建一个文件,例如:/var/log/django_db.log 并确保 apache 用户可以读取和写入该文件。

您的脚本似乎将 / 作为当前目录。尝试设置日志文件的绝对路径:

'db_handler': {
    ...
    'filename': '/path/to/logs/django_db.log',
    ...
},

并且不要忘记权限。您的脚本很可能是从 wwwnobody 用户运行的。

好的,和对方推荐的一样。我必须指出一条绝对路径。所以这就是我在 settings.py

中所做的
    #settings.py


    ...
    'db_handler': {
        'level':'DEBUG',
        'class':'logging.handlers.RotatingFileHandler',
        'filename': os.path.join(BASE_DIR, 'logs/django_db.log'),
        'maxBytes': 1024*1024*5, # 5 MB
        'backupCount': 5,
        'formatter':'standard',
    },
    ...

然后在父目录中我这样做了。

chmod 666 logs/*.log

现在一切都很好..:)

也许 Apache 无法解析您的 settings.py 文件中给定的相对路径。为了安全起见,请避免在 settings.py 文件中对 link 进行硬编码。您可以使用 python 的 os 模块来构造 django_db.log 文件的绝对路径。例如,我的 SQLite 数据库文件路径为 db/mypy_app.db。现在构建它的绝对路径,我会在我的 settings.py 文件中写这样的东西:

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
SETTINGS_DIR = os.path.dirname(__file__)
PROJECT_PATH = os.path.join(SETTINGS_DIR, os.pardir)
PROJECT_PATH = os.path.abspath(PROJECT_PATH)
DATABASE_PATH = os.path.join(PROJECT_PATH, 'db/mypy_app.db')
DATABASE_PATH = os.path.abspath(DATABASE_PATH)

然后在代码中使用 DATABASE_PATH 变量。尝试对 logs/django_db.log 文件做类似的事情。无论您在任何系统上尝试,这都会起作用。