2017-11-16 2 views
0

, 나는 로그 파일에 티 표준 출력과 표준 에러에 싶습니다 로그인 포함 :만들기 파이썬 로거는 모든 표준 출력과 표준 에러 메시지가 파이썬 로깅 패키지를 사용하고, 클래스 로그를 작성

16/11/2017 09:51:58 INFO - line1 
16/11/2017 09:51:58 INFO - line2 
16/11/2017 09:51:58 INFO - err1 

어떤 생각이 어떻게 "로깅"패키지 (타임 스탬프, ...)를 장점을 유지,이 로그 클래스를 작성?

+0

'print (msg)'대신'log.log (msg)'를 호출 할 수는 없습니까? – Arne

+0

아니요 (변경하려면 너무 많은 "인쇄";-) https://stackoverflow.com/questions/616645/how-do-i-duplicate-sys-stdout-to-a-log-file-in-python을 확인했습니다. 및 https://stackoverflow.com/questions/14058453/making-python-loggers-output-all-messages-to-stdout-in-addition-to-log (그러나 그 반대의 경우). –

+0

당신이 이것을 알고 있는지 확인하기 위해 logger에 스트림 핸들러를 추가하면 logger가'log.txt'와'stdout' 또는'stderr'에 모두 쓸 수 있습니다 : 'ch = logging.StreamHandler (sys .stdout)' 'ch.setLevel (logging.DEBUG)' 'log.addHandler (ch)' – Arne

답변

0

오른쪽 당신이 물어 보는 것을 달성하는 방법은 Logger 객체를 사용하는 것입니다. 그것은 훨씬 더 많은 유연성을 제공합니다. 이 객체는 여러 핸들러에 바인딩 될 수 있습니다. sys.stdout에 메시지를 기록하려면 스트림 핸들러가 필요하며 파일 핸들러는 파일에 기록하기 위해 필요합니다. 그런 다음 화면에 인쇄하고 단일 명령으로 파일에 기록합니다.

import logging 

# create logger 
logger = logging.getLogger('example') 
logger.setLevel(logging.INFO) 

# create file handler which logs messages 
fh = logging.FileHandler('fh.log') 
fh.setLevel(logging.DEBUG) 

# create console handler to print to screen 
ch = logging.StreamHandler() 
ch.setLevel(logging.INFO) 

# create formatter and add it to the handlers 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
fh.setFormatter(formatter) 
ch.setFormatter(formatter) 

# add the handlers to the logger 
logger.addHandler(fh) 
logger.addHandler(ch) 

지금 logger.info(msg) 호출 할 때마다 화면에 모두 인쇄 및 fh.log 파일에 기록됩니다.


sys.stdoutsys.stderr 스트림 객체를 대체 할 수있는 또 다른 방법이있다. 클래스를 만들고 사용자 정의 (original answer here) :

import sys 

class writer(object): 
    _fh = None 
    _orig_stdout = sys.stdout 

    def __init__(self): 
     _fh = open('logging.log', 'w') 

    def write(self, data): 
     fp.write(data) 
     _orig_stdout.write(data) 

    def flush(): 
     _orig_stdout.flush() 

logger = writer() 

sys.stdout = logger 
sys.stderr = logger 
+0

아니요. "인쇄"명령을 계속 사용하고 싶습니다. 가능한 경우, 로거 장점을 사용하여 로그 파일에 저장하십시오. https://stackoverflow.com/questions/616645/how-do-i-duplicate-sys-stdout-to-a-log-file-in-python에서 "multifile class"(shx2의 답변)와 같은 것 –

+0

내 이름 확인 업데이트 된 답변. 그렇다면'writer' 클래스를 사용하십시오.하지만 로거를 사용하는 것이 좋습니다. 지금이 일을하지 않으려 고하면, 저를 믿으십시오. 앞으로이 코드를 계속 개발한다면 앞으로도 계속 될 것입니다. – Vinny

관련 문제