공부하기싫어
article thumbnail
Published 2023. 8. 5. 16:32
logging module 파이썬

목차

     

     

    테스트 목적

    • logging 모듈 사용해 기존 코드 대체
    • python 코드 실행중에도 파일에 실시간 로깅 → 파일에 다른 작업을 할 수 있는지 확인
    • 종속성 확인 (추가로 패키지를 설치해야 하는지 확인)

    1. 모듈 사용법

    python 기본 모듈이기 때문에 패키지를 따로 설치할 필요는 없음

    1.1 handler 생성

    import logging
    
    # logger instance 생성
    logger = logging.getLogger(__name__)
    
    # handler 생성 (file type)
    fileHandler = logging.FileHandler('/home/cyaninn/test/test-logging-230805/test-output.log')
    

    'name' 은 logger의 이름을 설정해주는 부분입니다.

    아무런 이름 없이 호출하게 되면 자동으로 root logger 로 설정되며,

    모든 logger의 부모와 같은 형태가 됩니다.

    원하는 logger의 이름을 String 자료형으로 입력해주면 됩니다.

    FileHandler 에 로그를 생성할 디렉토리+파일을 설정 해주시면

    해당 파일이 없을 시, 파일이 생성되면서 로그가 출력되고

    파일이 있을 시, 기존 파일에 이어서 로그가 출력됩니다.

    1.2 로깅 레벨

    로그 출력 시 Debug, Info, Warning 등 로그의 Level을 설정 할 수 있는데요

    DEBUG 간단히 문제를 진단하고 싶을 때 필요한 자세한 정보를 기록함

    INFO 계획대로 작동하고 있음을 알리는 확인 메시지
    WARNING 소프트웨어가 작동은 하고 있지만,예상치 못한 일이 발생했거나 할 것으로 예측된다는 것을 알림
    ERROR 중대한 문제로 인해 소프트웨어가 몇몇 기능들을 수행하지 못함을 알림
    CRITICAL 작동이 불가능한 수준의 심각한 에러가 발생함을 알림

    setLevel() 메소드를 이용하여, 출력 범위를 정할 수 있습니다.

    logger.setLevel(level=logging.ERROR) # ERROR 레벨
    logger.debug('my DEBUG log')
    logger.info('my INFO log')
    logger.warning('my WARNING log')
    logger.error('my ERROR log')
    logger.critical('my CRITICAL log')
    

    errer level result

     

    logger.setLevel(level=logging.DEBUG) # DEBUG 레벨
    logger.debug('my DEBUG log')
    logger.info('my INFO log')
    logger.warning('my WARNING log')
    logger.error('my ERROR log')
    logger.critical('my CRITICAL log')
    

    debug level result

    1.3 formatter 설정

    로그 출력 시 입력하는 데이터(message) 외 원하는 데이터를 미리 설정하여 출력 할 수 있습니다.

    formatter 설정을 통해 출력할 로그의 폼을 아래 예시와 같이 사용이 가능합니다.

    속성 format 설명

    asctime %(asctime)s 인간이 읽을 수 있는 시간 표시
    created %(created)f logRecord가 만들어진 시간
    filename %(filename)s pathname의 file 이름 부분
    funcName %(funcName)s logging call을 포함하는 function의 이름
    levelname %(levelname)s 메시지의 Text logging level: 예) INFO
    lineno %(lineno)d logging call이 발생한 코드의 line 숫자
    module %(module)s filename의 모듈 이름 부분
    message %(message)s 메시지
    name %(name)s logger의 이름
    pathname %(pathname)s full pathname
    thread %(thread)d thread ID
    threadName %(threadName)s thread 이름
    # handler 생성 (file type)
    fileHandler = logging.FileHandler('/home/cyaninn/Cryptocurrency-autotrade-pyupbit/test/test-logging-230805/test-output.log')
    
    # formatter 생성 및 적용
    formatter = logging.Formatter('[%(asctime)s][%(levelname)s|%(filename)s:%(lineno)s] >> %(message)s')
    fileHandler.setFormatter(formatter)
    
    # logger instance에 handler 설정
    logger.addHandler(fileHandler)
    

     

     

    2. 함수 작성

    import logging
    import time
    
    # logger instance 생성
    logger = logging.getLogger(__name__)
    
    # handler 생성 (file type)
    fileHandler = logging.FileHandler('/home/cyaninn/Cryptocurrency-autotrade-pyupbit/test/test-logging-230805/test-output.log')
    
    formatter = logging.Formatter('[%(asctime)s][%(levelname)s|%(filename)s:%(lineno)s] >> %(message)s')
    fileHandler.setFormatter(formatter)
    
    # logger instance에 handler 설정
    logger.addHandler(fileHandler)
    
    # set log level
    logger.setLevel(level=logging.DEBUG)
    
    while True :
        logger.debug('running')
        time.sleep(1)
    

     

     

    3. 테스트 결과

     

    # python 코드 실행중
    $ cp test-output.log test-output.log.bak
    $ ls
    test-logging.py  test-output.log  test-output.log.bak
    
    $ tail test-output.log
    [2023-08-05 16:26:36,954][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:26:37,955][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:26:38,957][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:26:39,958][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:26:40,959][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:26:41,961][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:26:42,961][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:26:43,963][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:26:44,965][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:26:45,965][DEBUG|test-logging.py:21] >> running
    
    $ head test-output.log
    [2023-08-05 16:18:15,590][DEBUG|test-logging.py:17] >> my DEBUG log
    [2023-08-05 16:18:15,590][INFO|test-logging.py:18] >> my INFO log
    [2023-08-05 16:18:15,590][WARNING|test-logging.py:19] >> my WARNING log
    [2023-08-05 16:18:15,590][ERROR|test-logging.py:20] >> my ERROR log
    [2023-08-05 16:18:15,590][CRITICAL|test-logging.py:21] >> my CRITICAL log
    [2023-08-05 16:24:02,474][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:24:03,476][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:24:04,477][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:24:05,479][DEBUG|test-logging.py:21] >> running
    [2023-08-05 16:24:06,481][DEBUG|test-logging.py:21] >> running
    

    참고

    https://stickode.tistory.com/209