2013-07-10 2 views
0

현재 여러 프로세스에서 하나의 파일에 로그하려고하는데 많은 문제가 있습니다. 나는 stackoverflow와 구글과 같이 온라인으로 수많은 시간을 보냈지 만 구체적인 것은 아무것도 내놓지 않았다. 내가 zzzeek의 코드를 사용하려고했습니다 How should I log while using multiprocessing in Python?Python 다중 프로세스, 로깅, 다양한 클래스

그러나 그것은 나를 위해 파일에 기록하지 않습니다

은 내가 읽었습니다. 나는 그것을하는 특정한 방법이 없다 - 나는 가능한 모든 방법을 시도해왔다.

당신이 일하고 샘플 코드를 가지고 있거나 다른 방법이 있습니까? 동일한 파일에 여러 프로세스를 로깅해야합니다. 여러 클래스의 오류를 같은 파일에 기록하고 싶습니다. 그러나 나는 다중 프로세스를 간단하게 작동시키는 것에 만족한다. 이 게시물에

감사

+0

zzzeek의 처리기를 사용하는 코드를 사용하고 있습니까? 왜냐하면 만약 당신이 그것을 잘못 사용하고 있다면 우리가 당신이 어떻게 사용하고 있는지 모른다면 그것을 디버깅 할 수 없기 때문입니다. 나는 당신이 "나는 할 수있는 모든 방법을 시도하고있다"고 말한 것을 알고 있지만 적어도 한 가지 방법을 보여 주어야합니다. – abarnert

답변

1

이 zzzeek의 핸들러와 함께 작동 몇 가지 예제 코드입니다 :

여기
mtlog = MultiProcessingLog('foo.log', 'a', 0, 0) 
logging.getLogger().addHandler(mtlog) 

def task(_): 
    logging.error('Hi from {}'.format(os.getpid())) 

p = multiprocessing.Pool() 
p.map(task, range(4)) 

내 그것을 실행의 : 사실

$ python mtlog.py 
$ cat foo.log 
Hi from 6179 
Hi from 6180 
Hi from 6181 
Hi from 6182 

, 난 그냥 좋은 작품을 가지고 올 어떤 사소한 테스트. 분명히, 당신은 당신의 모든 시도에서, 아마도 똑같은 일을하고 있습니다.


가장 먼저 Windows에서 사용하려고합니다. Noah Yetter 님의 의견 :

불행히도이 접근법은 Windows에서 작동하지 않습니다. docs.python.org/library/multiprocessing.html From 16.6.2.12 "Windows 하위 프로세스는 상위 프로세스의 로거 수준 만 상속합니다. 로거의 다른 사용자 지정은 상속되지 않습니다." 서브 프로세스는 핸들러를 상속하지 않으므로 pickleable이 아니기 때문에 명시 적으로 전달할 수 없습니다.

zzzeek 비록 그가 나는 그가 잘못 90 % 확신 작동합니다 생각한다는 응답 :

난 단지는 다중 모듈에 내장 돼있어 로거를 의미한다고 생각합니다. 이 조리법은 그 사용법을 만들지 않고, loglevel 전파 전파를 신경 써서는 안되며 보통의 다중 처리 채널을 사용하여 자식에서 부모로 데이터를 왕복합니다.

정확히 역행합니다. 로그 수준의 전파 작업을 수행합니다. addHandler의 전파는 이 아닌입니다.

이 작업을 수행하려면 queue을 명시 적으로 하위에 전달하고 하위 사이드 로거를 빌드해야합니다.

관련 문제