apache2使用什么权限/用户来编写django日志

时间:2016-11-21 07:15:28

标签: python django apache mod-wsgi

我有一个非常好的问题,我希望专家为我发表评论。 (也许是格雷厄姆·杜普顿)

所以我有一个Django Web应用程序(在ubuntu 16.04上开发),它在/var/log/apache2/APPNAME.log中输入了一些失败信息。

因为/ var / log / apache2中的所有文件都有root:adm owner,我以相同的方式授予了我的日志文件的所有权,并且我确保www-data是adm组的成员。然后我将rwx授予了所有者组的adm组,我测试了一切正常。

24小时后,文件和父文件夹的权限发生了变化,我可以看到写入权限已从日志文件和父目录中撤销,导致权限被拒绝错误,因为无法写入日志文件。

如果您能提供帮助,以下是我的问题:

1)放置Django日志文件的地方在哪里?

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

3)哪个进程重置/ var / log / apache中的权限以及为什么?

提前多多谢谢你,

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

干杯, 麦克

views.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',
        },
    }
}

settings.py

DateTime date = new DateTime(Convert.ToInt64(timestamp.Text));

2 个答案:

答案 0 :(得分:6)

1)放置Django日志文件的地方在哪里?

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

在任何情况下,/var/log/apache2都是错误的,因为您发现问题,logrotate会干扰。更多关于以下内容。

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

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

这些进程正在写入文件的用户是进程运行的用户。对于mod_wsgi,您可以为user指令指定WSGIDaemonProcess选项。根据{{​​3}},“如果没有提供此选项,守护进程将作为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项目的日志,否则它们最终可能会填满磁盘。

答案 1 :(得分:1)

对于mod_wsgi,最好将Python日志记录定向到stderrstdout,以便在Apache错误日志中捕获它。不要像使用Apache日志文件那样创建单独的日志文件,日志文件轮换之类的内容将自动为您处理。有关示例,请参阅:

中的“记录Python异常”

确保为VirtualHost为Apache配置单独的错误日志,以便将站点的日志记录单独保存到主Apache错误日志中。