설정이 다른 두 파일에 로깅


84

모든 모듈의 모든 메시지가 단일 파일에 저장되는 기본 로깅 구성을 이미 사용하고 있습니다. 그러나 지금은 더 복잡한 솔루션이 필요합니다.

  • 두 개의 파일 : 첫 번째 파일은 동일하게 유지됩니다.
  • 두 번째 파일에는 몇 가지 사용자 지정 형식이 있어야합니다.

나는 모듈에 대한 문서를 읽고 있었는데, 지금은 매우 복잡합니다. 로거, 핸들러 ...

간단히 말해서 :

Python 3에서 두 파일에 로그인하는 방법, 즉 :

import logging
# ...
logging.file1.info('Write this to file 1')
logging.file2.info('Write this to file 2')

답변:


155

다음과 같이 할 수 있습니다.

import logging
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')


def setup_logger(name, log_file, level=logging.INFO):
    """To setup as many loggers as you want"""

    handler = logging.FileHandler(log_file)        
    handler.setFormatter(formatter)

    logger = logging.getLogger(name)
    logger.setLevel(level)
    logger.addHandler(handler)

    return logger

# first file logger
logger = setup_logger('first_logger', 'first_logfile.log')
logger.info('This is just info message')

# second file logger
super_logger = setup_logger('second_logger', 'second_logfile.log')
super_logger.error('This is an error message')

def another_method():
   # using logger defined above also works here
   logger.info('Inside method')

1
기본 로그 수준은 logging.WARNING이므로 Logger.setLevel(logging.WARNING)를 호출 하면 더 명확합니다 .
zeekvfu

1
logger_1로그 파일에 출력되지 않습니까? 내가 설정 한 logger_1.error('error foo'),하지만 여전히 작동하지
Gank

@zeekvfu의 주석과 @Gank의 질문을 결합합니다 ...에서 logger_1.info('message_1')줄 을 보려면 simplefile_1.log수준을 INFOusing으로 설정 logger_1.setLevel(logging.INFO)하거나 logger_1.error('message_1')대신 사용해야 합니다. INFO메시지는 분명히 수준이 때 기록되지 않습니다 WARNING기본이다.
dnlbrky 2015 년

대답을 편집했습니다. logger_1.info를 logger_1.warning으로 설정하십시오. 이렇게하면 레벨을 설정할 필요가 없습니다.
user1812076 2015

1
@ eos87 logger_1 및 logger_2는 전역입니까? 즉, 모든 기능 내에서 사용할 수 있습니까? 그렇지 않다면 def main 함수에서 전역으로 만드는 것이 좋은 생각입니까? 그렇다면 어떻게 하시겠습니까?
Dnaiel

19
def setup_logger(logger_name, log_file, level=logging.INFO):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter('%(message)s')
    fileHandler = logging.FileHandler(log_file, mode='w')
    fileHandler.setFormatter(formatter)
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)

    l.setLevel(level)
    l.addHandler(fileHandler)
    l.addHandler(streamHandler)    


setup_logger('log1', txtName+"txt")
setup_logger('log2', txtName+"small.txt")
logger_1 = logging.getLogger('log1')
logger_2 = logging.getLogger('log2')




logger_1.info('111messasage 1')
logger_2.info('222ersaror foo')

1
logger_1 및 logger_2는 전역입니까? 즉, 모든 기능 내에서 사용할 수 있습니까? 그렇지 않다면 def main 함수에서 전역으로 만드는 것이 좋은 생각입니까? 그렇다면 어떻게 하시겠습니까?
Dnaiel

def에서 그렇게하지 않고 로거를 정의 할 때마다 그렇게합니다.
Alex R

1
이로 인해 콘솔 출력이 중복되지 않습니까?
Erol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.