Python 将所有错误记录到Django站点上的控制台或文件中

Python 将所有错误记录到Django站点上的控制台或文件中,python,django,facebook,Python,Django,Facebook,在调试模式下运行runserver时,如何让Django 1.0将所有错误写入控制台或日志文件 我尝试过使用一个中间件类,该类具有process_exception函数,如对此问题的公认答案所述: 对于某些异常(例如:views.py中的assert(False))调用process_exception函数,但是对于其他错误(例如:urs.py中的import thisclassdoesnotexist),没有调用process_exception函数。我是Django/Python新手。这是

在调试模式下运行runserver时,如何让Django 1.0将所有错误写入控制台或日志文件

我尝试过使用一个中间件类,该类具有process_exception函数,如对此问题的公认答案所述:

对于某些异常(例如:views.py中的assert(False))调用process_exception函数,但是对于其他错误(例如:urs.py中的import thisclassdoesnotexist),没有调用process_exception函数。我是Django/Python新手。这是因为运行时错误和编译时错误之间存在某种区别吗?但我希望runserver会抱怨这是否是编译时错误,而事实并非如此

我看过Simon Willison关于Django调试()的精彩演示,但我没有看到一个适合我的选项

如果相关的话,我正在写一个Facebook应用程序,Facebook用他们自己的信息掩盖HTTP 500错误,而不是显示Django令人惊叹的信息量为500的页面。因此,我需要一种将所有类型的错误写入控制台或文件的方法

编辑:我想我的期望是,如果Django在URL.py中有一个错误导入(ImportError)时可以返回一个包含大量详细信息的500错误页面,那么它应该能够将相同的详细信息写入控制台或文件,而不必向代码中添加任何额外的异常处理。我从未见过导入语句周围的异常处理

谢谢,
Jeff

首先,通过异常日志可以看到的编译时错误很少。如果您的Python代码没有有效的语法,那么在打开日志进行编写之前,它就会消失很久

在Django运行服务器模式下,“print”语句写入stdout,您可以看到。然而,这不是一个好的长期解决方案,所以不要指望它

然而,当Django在Apache下运行时,它取决于您使用的插件。mod_python不容易处理。mod_wsgi可以强制发送stdout和stderr到日志文件

不过,您最好的选择是模块。将初始化放入顶级
url.py
以配置日志记录。(或者,您的
设置.py

确保每个模块都有一个可用于写入日志消息的记录器


确保您进行的每个web服务调用都有一个try/except块,并将异常写入日志。

首先,通过异常日志可以看到的编译时错误很少。如果您的Python代码没有有效的语法,那么在打开日志进行编写之前,它就会消失很久

在Django运行服务器模式下,“print”语句写入stdout,您可以看到。然而,这不是一个好的长期解决方案,所以不要指望它

然而,当Django在Apache下运行时,它取决于您使用的插件。mod_python不容易处理。mod_wsgi可以强制发送stdout和stderr到日志文件

不过,您最好的选择是模块。将初始化放入顶级
url.py
以配置日志记录。(或者,您的
设置.py

确保每个模块都有一个可用于写入日志消息的记录器


确保您进行的每个web服务调用都有一个try/except块,并将异常写入日志。

这有点极端,但出于调试目的,您可以启用该设置。这将允许您设置自己的错误处理。设置上述错误处理的最简单方法是重写。这将终止您的应用程序,但它会起作用。也许你可以做一些事情使它不会杀死你的应用程序,但这将取决于你部署它的平台。无论如何,不要在生产中使用它

对于生产,您几乎必须有大量的错误处理。我使用的一种技术是这样的:

>>> def log_error(func):
...     def _call_func(*args, **argd):
...         try:
...             func(*args, **argd)
...         except:
...             print "error" #substitute your own error handling
...     return _call_func
...
>>> @log_error
... def foo(a):
...     raise AttributeError
...
>>> foo(1)
error
如果在视图中使用log_error作为装饰器,它将自动处理其中发生的任何错误

对于某些异常(例如:views.py中的assert(False)),会调用process
\uuuu
异常函数,但对于其他错误(例如:urs.py中的import thisclassdoesnotexist),则不会调用process
\uu
异常函数。我是Django/Python新手。这是因为运行时错误和编译时错误之间存在某种区别吗

在Python中,所有错误都是运行时错误。导致问题的原因是,在调用视图之前导入模块时,这些错误会立即发生。我发布的第一个方法将捕获这些错误以进行调试。您可能能够为生产解决一些问题,但我认为,如果您在生产应用程序中获得导入程序(并且您没有进行任何动态导入),您的问题会更严重


像这样的工具可以帮助您消除此类问题。

这有点极端,但出于调试目的,您可以打开设置。这将允许您设置自己的错误处理。设置上述错误处理的最简单方法是重写。这将终止您的应用程序,但它会起作用。也许你可以做一些事情使它不会杀死你的应用程序,但这将取决于你部署它的平台。无论如何,不要在生产中使用它

对于生产,您几乎必须有大量的错误处理。我使用的一种技术是这样的:

>>> def log_error(func):
...     def _call_func(*args, **argd):
...         try:
...             func(*args, **argd)
...         except:
...             print "error" #substitute your own error handling
...     return _call_func
...
>>> @log_error
... def foo(a):
...     raise AttributeError
...
>>> foo(1)
error
如果在视图中使用log_error作为装饰器,它将自动处理其中发生的任何错误

对于某些异常(例如:views.py中的assert(False)),会调用process
\uuuu
异常函数,但对于其他错误(例如:urs.py中的import thisclassdoesnotexist),则不会调用process
\uu
异常函数。我是Django/Python新手。是因为这样吗