是否有一个显示文件打开失败的linux错误日志文件?

时间:2014-10-05 04:35:53

标签: python linux logging var error-log

我只是吹了几天跟踪python脚本中的错误(我不知道,web2py使用了与我期望的不同的根目录,导致文件读取无声地失败。因此当从命令行运行时,代码很好,但是当从web运行时,代码失败了)。 终于找到了罪魁祸首我可以修复无声失败(在这个案例中是在库中,openCV),但是如果存在某种系统日志,那么聪明的侦探就会看到失败。然后,无论沉默失败在哪里,我仍然看到它,并且不必费心追查失败 那么 - 是否存在某种针对linux的全局错误日志文件,它记录了文件读取错误等内容? 是的,我知道有python特定的错误记录,但问题仍然存在。例如如果我有一个复杂的项目与一些python,一些C,一些什么,某人在某处默默地失败,系统范围的错误日志将是非常有帮助。

2 个答案:

答案 0 :(得分:1)

这个解决方案可能无法满足您的需求,但无论我想报告一些我做过的研究,都可能会引导您朝着正确的方向发展。

首先,在/ var / log下有linux系统的日志记录。有趣的是syslog和messages文件,它们记录各种系统事件。但是不记录文件读取“错误”,如下所述。

在打开不存在的文件的情况下,我们最终会找到失败的open system callpython's open calls this)。但是在这个低级别没有异常的概念 - 如果打开失败,它只返回一个负数。在C中,您可以打开一整天都不存在的文件,但程序仍然会返回0错误代码。

这意味着您必须自己做一些工作来跟踪此问题。我问你的问题是,“如何在低于python的例外情况下跟踪这些错误?”为此,您可以使用strace和grep的组合。您为每个进程附加strace并记录发生的所有系统调用。

想象一下,我们有一个看起来像这样的C程序:

#include <stdio.h>
int main()
{
    fopen("nothere.txt","r");
}

运行strace ./test 2&gt;&amp; 1 | grep ENOENT,我们得到:

open("nothere.txt", O_RDONLY)           = -1 ENOENT (No such file or directory)

你当然可以在python进程上运行strace来获得相同的结果。

要警惕的事情:

  1. 您必须按程序附加此内容。如果不这样做,我们就会回到无声错误。
  2. Python会生成大量系统调用。您的日志文件可能会变大。
  3. 那里有很多IO错误。 ENOENT只是其中之一。
  4. 您需要更复杂的字符串解析来过滤掉您不关心的系统调用。

答案 1 :(得分:0)

也许您可以发布正在读取文件的代码? open()失败应始终生成IOError异常:

with open('no-such-file') as f:
    print f.read()

Traceback (most recent call last):
  File "app.py", line 1, in <module>
    with open('no-such-file') as f:
IOError: [Errno 2] No such file or directory: 'no-such-file'

令人沮丧的原因很可能是错误的异常处理,如下面的代码所示:

try:
    with open('no-such-file') as f:
      print f.read()
except Exception, e:
    print 'bad exception handling here'