오른쪽 당신이 물어 보는 것을 달성하는 방법은 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.stdout
및 sys.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
'print (msg)'대신'log.log (msg)'를 호출 할 수는 없습니까? – Arne
아니요 (변경하려면 너무 많은 "인쇄";-) 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 (그러나 그 반대의 경우). –
당신이 이것을 알고 있는지 확인하기 위해 logger에 스트림 핸들러를 추가하면 logger가'log.txt'와'stdout' 또는'stderr'에 모두 쓸 수 있습니다 : 'ch = logging.StreamHandler (sys .stdout)' 'ch.setLevel (logging.DEBUG)' 'log.addHandler (ch)' – Arne