2014-10-05 4 views
1

난 그냥 파이썬 스크립트 (나에게 알 수없는 버그를 추적 며칠 폭파, web2py 내가 예상했던 것과 다른 루트 디렉토리를 사용하여 파일을 자동으로 실패로 이어지는 선도. 따라서 명령 줄에서 실행하면 코드 괜찮 았지만 웹에서 실행하면 코드가 실패했습니다). 마지막으로 범인을 추적하면 자동 응답 (이 경우 라이브러리에있는 openCV)을 해결할 수 있지만 더 똑똑한 형사가 있으면 시스템 로그에 오류가있는 것을 볼 수 있습니다. 그렇다면 침묵의 실패가 어디에 있든 나는 아직도 그것을보고 실패를 추적하여 추적 할 필요가 없습니다.
- 파일 읽기 오류 같은 것들을 기록하는 리눅스 용 일종의 전역 오류 로그 파일이 있습니까? 그리고 네, 거기에 파이썬 특정 오류 로깅을 알지만 질문은 여전히 ​​보유하고 있습니다. 예 : 내가 파이썬, 파이썬, 파이썬, 어딘가에서 어딘가에있는 복잡한 프로젝트를 가지고 있다면, 시스템 전체에 걸친 에러 로그가 엄청난 도움이 될 것이다.파일 열기 실패를 보여주는 Linux 용 오류 로그 파일이 있습니까?

+0

스크립트가 웹 서버에서 실행될 때 오류 메시지는 일반적으로 서버가 유지 관리하는 로그에 나타나므로 서버 구성 방법을 살펴야합니다. 나는 이것이 정확히 당신의 질문에 대답하지 않는다는 것을 안다. –

답변

1

이 솔루션은 충분히 확대됨하지 않을 수 있습니다 :

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' 

당신의 좌절의 원인은 대부분 잘못된 예외 처리는 다음 코드와 같이이다 귀하의 필요에 따라,하지만 상관없이 나는 올바른 방향으로 인도 할 수있는 몇 가지 연구에 대해보고하고 싶었습니다.

먼저 리눅스 시스템에서/var/log 아래에 로그인하고 있습니다. 관심있는 것은 모든 종류의 시스템 이벤트를 기록하는 syslog 및 messages 파일입니다. 그러나 파일 읽기 "오류"는 아래에 설명 된대로 기록되지 않습니다.

존재하지 않는 파일을 여는 경우 우리는 궁극적으로 실패한 open system call을 찾습니다 (python's open calls this). 그러나이 낮은 수준에는 예외 개념이 없습니다. 열지 않으면 실패하고 음수가 반환됩니다. C에서는 하루 종일 존재하지 않는 파일을 열어도 프로그램에서 0 오류 코드를 반환 할 수 있습니다.

이것은이 문제를 추적하기 위해 직접 작업해야한다는 것을 의미합니다. 나는 귀하의 질문에 "어떻게 이러한 오류를 파이썬 예외 아래에서 추적 할 수 있습니까?"라고 대답했습니다. 이를 위해 strace와 grep의 조합을 사용할 수 있습니다. 프로세스 당 strace를 첨부하면 모든 시스템 호출이 기록됩니다. | 2> & 1 ./test strace를 실행하여

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

:

그래서 우리는이처럼 보이는 C 프로그램이 상상 grep ENOENT :

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

동일한 결과를 얻으려면 물론 python 프로세스에서 strace를 실행할 수 있습니다. 당신은 프로세스 당이를 첨부해야

  1. :

    상황은주의해야합니다. 그렇지 않으면 조용한 오류로 되돌아갑니다.

  2. 파이썬은 많은 시스템 호출을 생성합니다. 로그 파일이 커질 수 있습니다.
  3. 많은 IO 오류가 있습니다. ENOENT는 그 중 하나 일뿐입니다.
  4. 신경 쓰지 않는 시스템 호출을 걸러 내기 위해 더 복잡한 문자열 구문 분석이 필요합니다.
+0

위대한 답변 xavier. 감사 –

0

아마도 파일을 읽는 코드를 게시 할 수 있습니까? 개방() 실패는 항상 IOError 예외를 생성해야합니다

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

감사하지만 오류의 원인을 찾지 못했습니다. 이미 발견했습니다. 난 미래의 이러한 유형의 오류를 찾고 피할 수있는 방법을 찾고 있었다, 시스템 오류 로그를 사용하여 항상 그러한 오류를보고합니다. 그런 다음 나쁜 코드를 추적하는 데 시간을 낭비해야합니다. –

+1

예외를 무시하고 무시하는 경우 라이브러리에 문제를 열어야합니다. 이런 종류의 것을 추적하는 시스템 로그는 없습니다. 이러한 오류를 알리는 것은 예외입니다. – andyvanee