为什么我的Django应用无法写入日志文件?

8 投票
1 回答
7058 浏览
提问于 2025-04-16 06:34

$ sudo /etc/init.d/apache2 restart

 * Restarting web server apache2  
 ... waiting .   ...done.  

用户名@服务器名 11月04日 星期四 18:54:37 ~/public_html/IDM_app
$ sudo tail -n 60 /var/log/apache2/error.log

[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38] mod_wsgi (pid=28760): Exception occurred processing WSGI script '/home/username/public_html/idm.wsgi'.  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38] Traceback (most recent call last):  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/usr/local/lib/python2.7/site-packages/Django-1.2.3-py2.7.egg/django/core/handlers/wsgi.py", line 230, in __call__  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     self.load_middleware()  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/usr/local/lib/python2.7/site-packages/Django-1.2.3-py2.7.egg/django/core/handlers/base.py", line 33, in load_middleware  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     for middleware_path in settings.MIDDLEWARE_CLASSES:  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/usr/local/lib/python2.7/site-packages/Django-1.2.3-py2.7.egg/django/utils/functional.py", line 276, in __getattr__  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     self._setup()  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/usr/local/lib/python2.7/site-packages/Django-1.2.3-py2.7.egg/django/conf/__init__.py", line 40, in _setup  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     self._wrapped = Settings(settings_module)  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/usr/local/lib/python2.7/site-packages/Django-1.2.3-py2.7.egg/django/conf/__init__.py", line 73, in __init__  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     mod = importlib.import_module(self.SETTINGS_MODULE)  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/usr/local/lib/python2.7/site-packages/Django-1.2.3-py2.7.egg/django/utils/importlib.py", line 35, in import_module  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     __import__(name)  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/home/username/public_html/IDM_app/settings.py", line 60, in <module>  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     from settings_local import *  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/home/username/public_html/IDM_app/settings_local.py", line 1, in <module>  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     from settings_Slicehost_idm import *  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/home/username/public_html/IDM_app/settings_Slicehost_idm.py", line 12, in <module>  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     format='%(pathname)s TIME: %(asctime)s MSG: %(filename)s:%(funcName)s:%(lineno)d %(message)s',  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/usr/local/lib/python2.7/logging/__init__.py", line 1500, in basicConfig  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     hdlr = FileHandler(filename, mode)  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/usr/local/lib/python2.7/logging/__init__.py", line 889, in __init__  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     StreamHandler.__init__(self, self._open())  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]   File "/usr/local/lib/python2.7/logging/__init__.py", line 908, in _open  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38]     stream = open(self.baseFilename, self.mode)  
[Thu Nov 04 18:54:27 2010] [error] [client 8.17.58.38] IOError: [Errno 13] Permission denied: '/home/username/public_html/IDM_app/log/django.osqa.log'  
[Thu Nov 04 18:54:36 2010] [notice] caught SIGTERM, shutting down  
[Thu Nov 04 18:54:37 2010] [notice] Apache/2.2.14 (Ubuntu) mod_wsgi/3.3 Python/2.7 configured -- resuming normal operations  

用户名@服务器名 11月04日 星期四 18:54:42 ~/public_html/IDM_app
$ ls -l /home/用户名/public_html/IDM_app/log/django.osqa.log

-rw-r--r-- 1 username 0 Nov  4 18:24 /home/username/public_html/IDM_app/log/django.osqa.log  

用户名@服务器名 11月04日 星期四 19:08:41 ~/public_html/IDM_app
$ ls -l ~/public_html/idm.wsgi

-rw-r--r-- 1 username 222 Nov  4 18:53 /home/username/public_html/idm.wsgi  

用户名@服务器名 11月04日 星期四 19:10:50 ~/public_html/IDM_app
$ cat ~/public_html/idm.wsgi

import os
import sys

sys.path.append('/home/username/public_html/IDM_app/')

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

用户名@服务器名 11月04日 星期四 19:11:02 ~/public_html/IDM_app
$ whoami

username

如果Apache2使用的是虚拟主机的设置文件 @ ~/public_html/idm.wsgi,那么系统认为哪个用户在尝试写入日志文件 log/django.osqa.log?

为什么我的Django应用无法写入它的日志文件?

1 个回答

17

Apache服务器可能是以apache这个用户身份在运行,这意味着它没有权限去写日志文件。它能正常启动是因为它只需要读取wsgi文件,而这个文件对所有用户都是可读的。你可以用chmod a+w django.osqa.log来给日志文件添加写权限,或者用chown <apache-user> django.osqa.log来改变文件的拥有者。

注意:推荐的方法是用chown来改变文件的拥有者。

注意2:这和你使用的系统有关,不过看起来像是Ubuntu系统,那么Apache的用户通常是www-data

撰写回答