2014-03-02 2 views
20

콘솔에 기록 할 로거를 설정하려고합니다. (Heroku의 로깅 애드온과 함께 Heroku를 사용하고 콘솔에 쓰여진 물건이 Papertrails에 표시되기 때문에 이걸 원합니다. . 메 자닌를 사용하지 않는 사람들을위한 장고의 로깅 페이지 당Django 콘솔에 로깅

LOGGING = { 
    'handlers' = { 
     'file': { 
      'level': 'DEBUG', 
      'class': 'logging.FileHandler', 
      'filename': 'mysite.log', 
      'formatter': 'verbose' 
     }, 
     'console':{ 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
     }, 
    }, 
    (...) 
    'loggers'={ 
     (...) 
     'page_processors': { 
      'handlers': ['console','file'], 
      'level': 'DEBUG', 
     } 
    } 
    (...) 
} 

(page_processors은 다음과 같습니다, 그것은 필터링 할 수있는 모든 좋은 Papertrail 기능 만들기) 설정에서

내가 먼저는 다음과 같은 노력했다 메 자닌은 페이지를 열 때마다 실행되며, 장고의 견해와 같다고 생각할 수 있지만 렌더링이 아닌 컨텍스트 만 수행합니다.

[02/Mar/2014 23:07:10] INFO [myApp.page_processors:13] page_progessor logging test 

등 : 내가 로거가 표시되지 않는 페이지를 새로 고침하지만 파일에 인쇄 및 로그를 볼 때 내가

import logging 
logger = logging.getLogger(__name__) 

@process_for(MyPage): 
def myfunc(request, Page): 
    logger.info('page_processor logging test') 
    print 'my page_processor print' 
    (...) 

이 page_processors.py에

나는 논리가 효과가 있다는 것을 알고있다. 인터넷 검색을 한 후이 문제를 정확히 해결 한 thisthis page을 발견했습니다. 그는 기본적으로 logging.StreamHandler가 STDERR에 기록한다고 말합니다. 우리는 STDOUT에 기록하려면 당신은 logging.StreamHandler 구조에 키워드 인수 '스트림'을 추가하고, 그래서 같은 핸들러를 구성해야합니다

'handlers':{ 
    (...) 
    'console':{ 
     'level': 'DEBUG', 
     'class': 'logging.StreamHandler', 
     'stream': sys.stdout 
    }, 
} 

이 여전히 작동하지 않습니다 밝혀, 그리고 돈 오류가 발생하지 않았는데 인쇄본과 파일 로그를 볼 수 있습니다. 콘솔 로거가 아닙니다.

무슨 일 이니?

편집 : 시도해 본 결과 this은 차이가 없습니다.

답변

19

나는 마침내 그것을 얻었다. 여기 무슨 일이 있었는지.

당신이 getLogger를 사용하여 로거를 정의

, 당신은이 경우

logger = logging.getLogger(__name__) 

에, 로거 이름을 지정하면 그 이름의 로거는 로깅 구성 동작하는 방법을 정의해야합니다. 이 경우 해당 파일은 모듈 내부에 있으므로 로거의 이름은 page_processors가 아닌 myApp.page_processors가되므로 LOGGING dict의 'page_processors'라는 로거는 절대로 호출되지 않습니다. 그렇다면 파일 로깅이 작동하는 이유는 무엇입니까? 코드에 표시되는 (...)에는 'myApp'라는 이름의 또 다른 로거가 있는데, 이는 분명히 대신 호출되며 파일에 기록합니다.

LOGGING = { 
    # (...) 
    'loggers': { 
     # (...) 
     'myApp.page_processors': { 
      'handlers': ['console','file'], 
      'level': 'DEBUG', 
     } 
    } 
    # (...) 
} 
16

다음 스크립트 :

import logging, logging.config 
import sys 

LOGGING = { 
    'version': 1, 
    'handlers': { 
     'console': { 
      'class': 'logging.StreamHandler', 
      'stream': sys.stdout, 
     } 
    }, 
    'root': { 
     'handlers': ['console'], 
     'level': 'INFO' 
    } 
} 

logging.config.dictConfig(LOGGING) 
logging.info('Hello') 

파일로 출력을 파이프하여 검증 할 수있는, sys.stdoutHello를 기록합니다. 따라서 문제는 다른 곳에서 발생할 가능성이 있습니다 (또는 sys.stdout이 예상 한 것과 다를 수 있습니다). sys.__stdout__으로 시도하면 차이가 있는지 확인할 수 있습니다.

+0

감사 :

그래서이 문제에 대한 해결책은 제대로 로거 이름을 지정하는 것입니다. __ stdout __이 작동하지 않습니다.그래, 나는 그 코드에 아무 문제가 없다고 믿을 수있다. (어쨌든 나는 그것을 다른 곳에서 가져왔다.) 파일에 로깅조차도 작동한다는 것이 이상하다. 다른 제안? – oneloop