我有一个非常好的问题,我希望专家能为我评论一下。 (也许是格雷厄姆·邓普尔顿)
所以我有一个 Django 网络应用程序(在 ubuntu 16.04 上开发),它在/var/log/apache2/APPNAME.log 上记录了一些失败,如下所示。
因为/var/log/apache2 中的所有文件都有 root:adm 所有者,我以同样的方式授予了我的日志文件的所有权,并且我确保 www-data 是 adm 组的成员。然后我将 rwx 授予所有者组的 adm 组,我测试了一切正常。
24 小时后,文件和父文件夹的权限已更改,我可以看到日志文件和父目录的写入权限已被撤销,导致权限被拒绝错误错误,因为无法写入日志文件。
以下是我的问题,如果您能帮忙的话:
1) Django 日志文件放在哪里合适?
2)什么进程在什么用户权限下写入文件?
3) 哪个进程重置了/var/log/apache 中的权限,为什么?
非常感谢您,
我希望这个问题也能帮助到其他人。
干杯, 迈克
View .py
from django.shortcuts import render
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django import forms
from django.core.mail import send_mail, EmailMessage
from StudioHanel.forms import ContactForm
import traceback
import time
# import the logging library
import logging
import sys
# Get an instance of a logger
#logger = logging.getLogger('APPNAME')
def contact(request):
logger.debug('Contact Start!')
if request.method == 'POST':
etc...
设置.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
},
'applogfile': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': os.path.join('/var/log/apache2', 'APPNAME.log'),
'maxBytes': 1024*1024*15, 15MB
'backupCount': 10,
},
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'APPNAME': {
'handlers': ['applogfile',],
'level': 'DEBUG',
},
}
}
最佳答案
1) Django 日志文件放在哪里合适?
最近我发起了一个discussion在关于用于 Django 项目的目录的 django-users 邮件列表中,我得出的结论是没有标准做法。我已经决定使用 /var/log/django-project-name
。
在任何情况下,/var/log/apache2
都是错误的地方,因为您发现的问题是 logrotate
会干扰。更多内容见下文。
2)什么进程在什么用户权限下写入文件?
如果使用Gunicorn,就是gunicorn
进程,如果使用uWSGI,就是uwsgi
。从您对 Graham Dumpleton 的引用来看,您正在使用 mod_wsgi。所以这个进程就是mod_wsgi守护进程。
这些进程写入文件的用户是进程运行的用户。对于 mod_wsgi,您可以为 WSGIDaemonProcess
指令指定一个 user
选项。根据its documentation ,“如果未提供此选项,则守护进程将以与 Apache 运行子进程相同的用户身份运行,并由 User 指令定义。”在 Ubuntu 中,这是 www-data
。我认为使用 user
选项并以不同的专用用户身份运行守护程序是个好主意。
您不应将 www-data
添加到 adm
组。 adm
组是有权读取日志文件的人。 www-data
不应该有这样的权限。 (读写它自己的日志文件没问题,但你不希望它有读取 /var/log/syslog
的权限。)
3) 哪个进程重置了/var/log/apache 中的权限,为什么?
是logrotate
,由cron运行;请参阅 /etc/cron.daily/logrotate
。 /etc/logrotate.d/apache2
中的配置操作匹配 /var/log/apache2/*.log
的所有文件。 logrotate
的主要目的是循环日志。即每天创建一个新的日志文件,昨天的命名为access.log.1
,昨天的命名为access.log.2.gz
,以此类推,超过几天的日志将被删除。这样做是为了节省空间并使日志易于管理。 logrotate
也会在文件错误时修复文件的权限。
理论上,您应该配置 logrotate
来轮换您的 Django 项目的日志,否则它们最终可能会填满磁盘。
关于python - apache2用什么权限/用户写django日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40714691/