2016-11-21 66 views
4

我有一个很好的问题,我想请专家为我评论一下。 (也许格雷厄姆Dumpleton)apache2用来写django日志的权限/用户

因此,我有一个Django Web应用程序(在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中的权限,为什么?

谢谢各位大大提前,

我希望这个问题帮助别人了。

干杯, 迈克

views.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... 

settings.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', 
     }, 
    } 
} 
+0

你的操作系统是什么? –

+0

Ubuntu 16.04是操作系统。 Web服务器是apache 2.4.18。 Djagno 1.7。如果你认为它也可以帮助其他人,请评价这个问题。干杯。 –

回答

4

1)其中,是把Django的日志文件正确的地方?

最近,我在django-users邮件列表中发起了discussion关于Django项目的目录,我认为没有标准的做法。我已经决定使用/var/log/django-project-name

无论如何,/var/log/apache2是错误的地方,因为你确定的问题,logrotate会干扰。更多关于下面的内容。

2)用户权限写入文件的过程是什么?

如果您使用Gunicorn,它是gunicorn进程,并且如果您使用uWSGI,则它是uwsgi。从您对Graham Dumpleton的引用来看,您正在使用mod_wsgi。所以这个过程就是mod_wsgi守护进程。

这些进程正在写入文件的用户是进程运行的用户。对于mod_wsgi,您可以指定一个user选项指向WSGIDaemonProcess指令。根据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项目的日志,否则它们最终可能会填满磁盘。

+0

真棒和巨大的谢谢你。 –

0

对于mod_wsgi,您最好将Python日志记录指向stderrstdout,以便在Apache错误日志中捕获它。不要像使用Apache日志文件那样创建单独的日志文件,日志文件旋转等事情将自动处理。举一个例子见下的“Python的异常记录”:

请确保虽然您配置一个单独的错误日志的Apache为VirtualHost,使您的网站日志记录都保存离开分开到主要的Apache错误日志。