2013-01-16 71 views
18

我有一个Django 1.4.2应用程序日志转到旋转文件。 在我的settings.py我:Django日志旋转和日志文件所有权

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创建的?

谢谢

+2

我也看到这种行为。你有没有发现它? – fluffels

回答

8

如果父目录的用户/组允许它可以创建新文件。我相信你需要更改目录的所有者,或者将一个组添加到包含apache用户的目录中,或者使用一些高级技术,例如ACL。

要测试它,请尝试以下操作:以root身份登录。切换到apache用户。尝试手动创建一个文件。切换回根目录,更改文件夹的权限/所有权,切换到apache用户,再试一次。这应该会给你一些关于脚本在尝试创建文件时是否会失败的更多信息。

最后,它有点违反直觉,确保apache用户以某种方式在该目录中拥有执行权限,否则它将不允许你进入该目录。

此外,我认为你需要设置目录的“s”位(chmod g+schmod 2755等),以便新添加的文件继承目录的权限。然后,您需要确保该组的位已设置,并且组拥有该目录。 (或者您可以将目录的组设置为www-data)。