2012-05-18 8 views
1

방금 ​​파이썬 로깅 모듈을 사용하기 시작했으며 이해할 수 없습니다.파이썬 로깅 : 프로세스마다 다른 로깅 대상

1 부분 (단일 프로세스) : 나는 다음과 같은 방식으로 작동하는 스크립트를 쓰고 있어요

이 (가 얼마나 중요하지) 일부 데이터는 계산에 도착. 여기에 나는 다음과 같은 방법으로 로거를 만듭니다 즉

import logging 
logging.basicConfig(format='%(asctime)-6s: %(name)s - %(levelname)s - %(message)s') 
logger = logging.getLogger('Pipeline') 
logger.setLevel(logging.INFO) 
logger.warning('Pipeline started') 

나는 화면에 로그인합니다.

두 번째 부분 (다중 처리) : 이전에 발견 된 데이터를 분석하기 위해 몇 가지 프로세스 (데이터 분석은 실제로 시간과 CPU를 소비합니다)를 만듭니다.

이제 각 프로세스는 화면에 로깅하지 않고 다른 파일에 기록합니다. 내가 쓴 무엇

입니다 : 내가 가진 무엇

fh = logging.FileHandler('/tmp/'+multiprocessing.current_process().name+'_worker.log') 
fmt = logging.Formatter(%(asctime)-6s: %(name)s - %(levelname)s - %(message)s) 
fh.setFormatter(fmt) 
local_logger = logging.getLogger(multiprocessing.current_process().name+'_worker') 
local_logger.addHandler(fh) 
local_logger.warning(multiprocessing.current_process().name + ' (worker) Process started') 

는 그 다른 파일하지만 화면에도 로그에 대한 각 프로세스 로그!

어떻게 해결할 수 있습니까?

답변

2

로컬 로거가 로그 메시지를 최상위 레벨로 넘기고, 표준 출력으로 출력되는 것으로 의심됩니다. 로컬 로거에서 전파를 끄십시오.

local_logger.propagate = False 
+0

나는 아마도 basicConfig()를 사용하여이 상황에 가장 적합한 선택이 아닐 수도 있다고 덧붙인다. 동료 Jason이 나에게 지적했듯이, 이것은 매우 간단한 로깅 설정을 의미합니다. 좀 더 '정교한'접근 방식을 사용하는 방법을 살펴 보는 것이 좋습니다. 검색을 통해 여러 접근법을 쉽게 찾을 수 있습니다. –

3

당신은 예술 SWRI의 방법으로 그것을 할 수있는, 아니면 그냥 basicConfig() 전화를 생략 : 나는 당신이 이런 식으로 그것을 할 수 있다고 생각합니다. 이것이 루트 로거에 콘솔 처리기를 추가하는 것입니다.