【问题标题】:apache2 with django - can't write to log file带有 django 的 apache2 - 无法写入日志文件
【发布时间】:2019-06-04 05:32:26
【问题描述】:

我在 apache2 服务器上运行 django。

我的settings.py 看起来像这样:

WSGI_APPLICATION = 'my_app.wsgi.application'
...

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'verbose': {
        'format': '%(levelname)s %(asctime)s %(module)s: %(message)s'
    }
},
'handlers': {
    'file': {
        'level': 'INFO',
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': '../django.log',
        'formatter': 'verbose',
        'maxBytes': 1024 * 1024 * 5,  # 5 MB
        'backupCount': 5,
    },
},
'loggers': {
    'my_app': {
        'handlers': ['file'],
        'level': 'INFO',
        'propagate': True,
    },
},

}

我的想法基本上是创建一个日志,我的 django 应用程序的所有组件都将写入日志,级别为 INFO。

我面临的问题是,在运行服务器时,使用root 权限创建日志:

 ll ../django.log 
 -rw-r--r-- 1 root root 0 Jan  9 10:17 ../django.log

所以,当我尝试登录它时会发生什么:

/var/log/apache2/error.log

[Wed Jan 09 11:37:43.677755 2019] [:error] [pid 1457:tid 140554321598208] [remote 192.168.254.52:60257] ValueError: Unable to configure handler 'file': [Errno 13] Permission denied: '../django.log'

我确实发现了这些问题:Permission Denied when writing log fileDjango: Setup an efficient logging system for a website in production

如果我将文件的权限更改为由 www-data 而不是 root 拥有,它可以工作。

我的问题是 - 在生产中设置它的正确位置在哪里?应该手动更改吗?也许在settings.pyapache2-config 的某个地方?

我正在寻找 django 日志记录的最佳实践。

编辑: ps辅助| grep apache2 显示:

root      1444  0.0  0.0  97916  7452 ?        Ss   13:22   0:00 /usr/sbin/apache2 -k start

ps辅助| grep wsgi 显示:

www-data  1447  0.0  0.2 510528 23692 ?        Sl   13:22   0:00 (wsgi:name -k start

谢谢!

【问题讨论】:

  • 您运行 django 应用程序的权限级别是多少?顺便说一句,你应该避免这是 root。
  • 编辑了我的问题。我认为 apache2 是用 root 运行的,但 django 是用 www-data 运行的
  • 好的,这是我的建议,之后我可以将其移至答案。您应该创建一个日志文件夹(在运行应用程序之前)并将其权限创建为 www-data。在您的日志记录配置中,将完整路径传递到此文件夹(即:'filename': os.path.join(BASE_DIR, 'logs')),然后尝试看看这是否适合您。

标签: python django logging apache2 django-logging


【解决方案1】:

事先在服务器中创建一个具有www-data权限的logs文件夹,并将其路径保存在环境变量中,使用python的settings.py文件中的os.getenv('LOG_PATH')来使用路径。

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多