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

标签 python django facebook

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

我试过使用带有 process_exception 函数的中间件类,如该问题的公认答案中所述:

How do you log server errors on django sites

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

我看过 Simon Willison 关于 Django 调试的精彩演讲 (http://simonwillison.net/2008/May/22/debugging/),但我没有看到适合我的选项。

如果它是相关的,我正在编写一个 Facebook 应用程序,Facebook 会用他们自己的消息来掩盖 HTTP 500 错误,而不是显示 Django 信息丰富的 500 页面。所以我需要一种方法将所有类型的错误写入控制台或文件。

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

谢谢, 杰夫

最佳答案

有点极端,但出于调试目的,您可以打开 DEBUG_PROPAGATE_EXCEPTIONS环境。这将允许您设置自己的错误处理。设置所述错误处理的最简单方法是覆盖 sys.excepthook .这将终止您的应用程序,但它会工作。您可能可以采取一些措施来使它不会终止您的应用程序,但这取决于您要为哪个平台部署它。无论如何,永远不要在生产中使用它!

对于生产环境,您几乎必须进行广泛的错误处理。我使用的一种技术是这样的:

>>> 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

如果您在 View 中使用 log_error 作为装饰器,它将自动处理其中发生的任何错误。

The process_exception function is called for some exceptions (eg: assert(False) in views.py) but process_exception is not getting called for other errors like ImportErrors (eg: import thisclassdoesnotexist in urs.py). I'm new to Django/Python. Is this because of some distinction between run-time and compile-time errors?

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

类似pylint 的工具不过可以帮助您消除这些类型的问题。

关于python - 将所有错误记录到 Django 站点上的控制台或文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/690723/

相关文章:

c# - 分页如何在 C# Facebook sdk 上工作

Facebook 分享按钮 : is it officially dead?

python - 如何绘制一定粗细的抗锯齿圆形线?如何设置 pygame.gfx.aacircle() 的宽度?

python - 无法通过端口 8000 访问图像(开发中)

python - 反转列表中行的顺序

python - Dict一键对Dics列表进行分组

python - Django 与 MSSQL 使用 Pyodbc : Model Forms not being saved

facebook - 使用 FB.api 在单个请求中向 facebook 询问多个用户的数据

python-dpkt : ICMP packet parsing

python - 如何将 XML Word 文档转换为 DOCX?