Python Django日志旋转和日志文件所有权

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

我有一个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': {
    '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运行,现在一切都好了。