我有一个非常好的问题,我希望专家为我发表评论。 (也许是格雷厄姆·杜普顿)
所以我有一个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中的权限以及为什么?
提前多多谢谢你,
我希望这个问题能帮助别人。
干杯, 麦克
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',
},
}
}
DateTime date = new DateTime(Convert.ToInt64(timestamp.Text));
答案 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日志记录定向到stderr
或stdout
,以便在Apache错误日志中捕获它。不要像使用Apache日志文件那样创建单独的日志文件,日志文件轮换之类的内容将自动为您处理。有关示例,请参阅:
确保为VirtualHost
为Apache配置单独的错误日志,以便将站点的日志记录单独保存到主Apache错误日志中。