2013-09-04 3 views
4

로거를 설정했습니다. 이런 식으로 :로거, 강제 회선 출력

def initLogger(self): 
    self.logger = logging.getLogger('MyApp') 
    if not self.logger.handlers: 
     hdlr = logging.FileHandler('MyApp.log') 
     formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
     hdlr.setFormatter(formatter) 
     self.logger.addHandler(hdlr) 
     self.logger.setLevel(logging.WARNING) 

프로그램 시작시 항상 로그에 한 줄을 인쇄하고 싶습니다. 하지만, 경고로 기록하고 싶지는 않습니다. 나는 단지 실행의 시작을 나타내는 흔적을 항상 갖고 싶다. 내가 INFO 나 DEBUG로 레벨을 바꿀 수 있고 self.logger.info ("Program start")를 호출 할 수 있다는 것을 알지만, 그것은 더러워 보인다. 로거 레벨에 관계없이 강제로 출력 할 수 있습니까?

감사

답변

2

단지 포맷터와 핸들러를 추가 한 후, 그러나 로거 수준을 설정하기 전에 로그 메시지를 작성하는 것입니다 마음에 오는 가장 쉬운 방법. 로깅 시스템이 프로그램에 의해 완전히 구성된 경우 로거를 명시 적으로 설정할 때까지 로거가 설정되지 않으므로 레벨을 설정할 때까지 모든 메시지가 기록됩니다.

또 다른 방법은 로그 수준을 설정하는 대신 필터를 설치하는 것입니다. 필터는 메시지가 지정된 패턴과 일치하거나 필터를 켜기 위해 메서드를 호출 할 때까지 특정 수준 아래의 모든 메시지를 거부 할 수 있습니다. 이렇게하면 약간의 효율성을 희생합니다. Logger의 표준 구현은 로깅 메소드가 호출 될 때 즉시 레벨을 점검하고, 메시지가 충분히 높은 레벨에 있지 않으면 폐기하고, 필터는 나중에 프로세스에서 점검됩니다.

코드 외부에 이미 로거 레벨이 WARNING으로 설정되어 있고이를 제어 할 수없는 경우 주변에는 아무런 변화가 없습니다. 로거 수준을 일시적으로 재설정해야합니다 (최상위 로거를 사용하지 않는 경우 지저분해질 수 있습니다. 로거의 여러 "세대"에서 수준을 확인 및 재설정해야하기 때문입니다) 또는 사용자 지정 Logger을 설치해야합니다 로거가 작성되기 전에 서브 클래스를 작성하십시오. 이 경우 로깅 시스템이 어쨌든 작동하는지 확인하는 것이 귀하의 책임이 아닐 수 있습니다.

+0

우수함. 레벨을 설정하기 전에 로깅은 합리적인 쉬운 접근법처럼 들립니다. 필터 아이디어를 지적 해 주셔서 감사합니다. –

0

파일을 열고 시동 메시지를 작성한 다음 스트림으로 StreamHandler에 전달할 수 있습니다.

0

나는 다음에 대해이 로깅 시스템의 남용으로 간주 될 수 있는지 확실하지 않습니다,하지만 :

2018-03-06 17:01:29:INFO:root:Program Start 

가장 높은 사전 정의 :

logging.addLevelName(100, 'INFO') 
logging.log(100, 'Program Start') 

이 결과 레벨 CRITICAL은 50이라는 값을 가지므로 가짜 INFO 레벨을 100으로 사용하면 현재 로그 레벨에 관계없이 항상 로그에 나타나도록 할 수 있습니다.

(할 수 있습니다 당신은 당신이 로그 수준 그 이상 때 ​​INFO 메시지가 표시 가지고 이상한 생각하면 같은 START 같은 수준 (100)에 다른 이름을 제공합니다. 원하는 경우)