이 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
을 명시 적으로 하위에 전달하고 하위 사이드 로거를 빌드해야합니다.
zzzeek의 처리기를 사용하는 코드를 사용하고 있습니까? 왜냐하면 만약 당신이 그것을 잘못 사용하고 있다면 우리가 당신이 어떻게 사용하고 있는지 모른다면 그것을 디버깅 할 수 없기 때문입니다. 나는 당신이 "나는 할 수있는 모든 방법을 시도하고있다"고 말한 것을 알고 있지만 적어도 한 가지 방법을 보여 주어야합니다. – abarnert