Python Django日志旋转和日志文件所有权
我有一个django 1.4.2应用程序日志记录到一个旋转文件中。 在my settings.py中,我有:Python Django日志旋转和日志文件所有权,python,django,Python,Django,我有一个django 1.4.2应用程序日志记录到一个旋转文件中。 在my settings.py中,我有: LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'standard': { 'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s' }, }, 'handlers': { 'de
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': '/var/www/html/logs/mylog.log',
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter':'standard',
},
'request_handler': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': '/var/www/html/logs/django_request.log',
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter':'standard',
},
},
'loggers': {
'': {
'handlers': ['default'],
'level': 'ERROR',
'propagate': True
},
'django.request': { # Stop SQL debug from logging to main logger
'handlers': ['request_handler'],
'level': 'DEBUG',
'propagate': False
},
}
}
因此,在日志目录中,我可以看到以下文件:
mc.log
mc.log.1
mc.log.2
mc.log.3
mc.log.4
mc.log.5
当mc.log达到5M时,文件将正确旋转,但新的mc.log将使用所有权root.root创建。
由于apache是在apache用户下运行的,因此它无法再访问文件,应用程序停止工作。
知道为什么新日志是用root.root所有权而不是apache.apache所有权创建的吗
谢谢如果父目录的用户/组允许,可以创建新文件。我相信您要么需要更改目录的所有者,要么向包含apache用户的目录添加一个组,或者使用一些高级技术,如ACL 要测试它,请尝试以下操作:以root用户身份登录。切换到apache用户。尝试手动创建一个文件。切换回root,更改文件夹的权限/所有权,切换到apache用户,然后重试。这将为您提供有关脚本在尝试创建文件时是否会失败的更多信息 最后,这有点违反直觉,请确保apache用户以某种方式拥有该目录中的执行权限,否则它将不允许您进入该目录
此外,我认为您需要设置目录的“s”位(
chmod g+s
或chmod 2755
等),以便新添加的文件继承目录的权限。然后,您需要确保该组的位已设置,并且该组拥有该目录。(或者您可以将目录组设置为www data)。我也看到了这种行为。你知道吗?我也有这个问题。我已经将wsgi配置为以用户apache的身份运行,一切正常,直到日志旋转,Django开始抛出500个内部服务错误,因为apache无法写入日志文件。我怀疑我的apacheconf或Django日志代码有问题。事实证明,我有一些cronjobs运行定制的Django管理命令,这些cronjobs以root用户身份运行,并将大量输出记录到日志文件中。这将导致日志文件在用户为root用户时旋转!我把我的cron作业改为作为apache运行,现在一切都好了。