이것 저것 테스트..

마크다운으로 글쓰기

마크다운으로 글쓰기 테스트 중…

코드 넣기 테스트

import logging
import colorlog

# python으로 대규모 프로젝트는 아니지만 간단한 유틸을 개발할때는 자주 사용하게 되는데요..
# 파이썬의 logging 모듈이 생각보다 복잡(?)해서 print 문을 활용하여 로그를 쌓는 경우가 많았습니다.
# 언제까지 print만 사용할 것인가..-?!
# 언젠간 한번 정리해봐야지 생각만 하다가...10년만에 드디어 정리할 마음이 생겼습니다..하하
# 100% 이해하진 못하더라도 복사&붙여넣기 할 정도는 정리를 해놔야겠습니다..

## logging을 간단하게 사용하고 싶다면 basicConfig에서 설정하여 사용하면 됩니다.
## 전체 로깅모듈에 대한 설정을 한번에 셋팅하여 사용할 수 있습니다.
## 그냥 단순하게 로깅을 하고 싶다면 이 방법을 사용하세요!
def default_logger_test() :
    logging.basicConfig(filename='myapp.log', 
                        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', 
                        datefmt='%Y/%m/%d %I:%M:%S %p', 
                        level=logging.INFO)

    logging.info('Started')
    logging.debug('debug message')
    logging.info('info message')
    logging.warning('warn message')
    logging.error('error message')
    logging.critical('critical message')
    logging.info('Finished')

## 참고자료 : https://hwangheek.github.io/2019/python-logging/
## 로깅을 좀 더 세분화하여 하고 싶다면 아래 logging 라이브러리의 구성요소에 대해 이해할 필요가 있습니다.
#
# logging 라이브러리는 모듈 방식으로 구성되며, logger, handler, filter 및 formatter와 같은 다양한 구성 요소를 제공합니다.
#  - 로거(logger)는 응용 프로그램 코드가 직접 사용하는 인터페이스를 노출합니다.
#    - 로그를 작성하거나(logger.info(), logger.debug()등), logger.setLevel(), logger.addHandler(), logger.addFilter() 와 같은 함수들이 있습니다.
#  - 처리기(handler)는 (로거에 의해 만들어진) 로그 레코드를 적절한 목적지로 보냅니다.
#    - 처리기에 따라서 File, Console. Socket 등 다양한 Destination에 로그를 보낼 수 있습니다.
#    - 설정된 formatter에 따라 출력포멧이 결정됩니다.
#  - 필터(filter)는 출력할 로그 레코드를 결정하기 위한 보다 정밀한 기능을 제공합니다.
#  - 포매터(formatter)는 최종 출력에서 로그 레코드의 배치를 지정합니다.

# 사용자는 logger를 생성하고, 그 안에 다양한 handler/filter/formmater를 설정하여 사용할 수 있습니다.
# (이런 decorate pattern 같은데....기억이 맞나 모르겠네..개발을 안한지 너무 오래됐습니다ㅠㅠ)

def custom_logger() :
    # 먼저 로거를 생성합니다.
    logger = logging.getLogger(__name__)

    # logger의 전체 level를 설정합니다. 
    # handler에 설정된 level은 logger에 설정된 level을 통과한 후 다시 필터링 됩니다.
    # logger에 level이 ERROR인 경우 handler에서 그 이하의 레벨을 설정하더라도 출력되지 않습니다.
    logger.setLevel(logging.DEBUG)

    # 출력 포멧을 결정한 formatter를 생성합니다.
    # 아래 포멧에 따라 log format이 결정됩니다.
    # levelname 및 name 뒤에 12, 8은 문자열 정렬을 위해 사용했습니다.
    # format에 관련된 더 다양한 속성들은 아래 문서를 참조하시기 바랍니다.
    # https://docs.python.org/3/library/logging.html#logrecord-attributes
    formatter = logging.Formatter(fmt='%(asctime)s - [%(filename)12s:%(lineno)d] - [%(levelname)8s] - %(message)s',
                                  datefmt='%Y/%m/%d %I:%M:%S %p' )

    # log level은 CRITICAL(50) > ERROR(40) > WARNING(30) > INFO(20) > DEBUG(10) > NOTSET(0)의 순서를 가집니다.
    # DEBUG 레벨 이상의 로그를 콘솔에 출력하는 Handler
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)

    # ERROR 레벨 이상의 로그를 `error.log`에 출력하는 Handler
    file_error_handler = logging.FileHandler('error.log')
    file_error_handler.setLevel(logging.ERROR)
    file_error_handler.setFormatter(formatter)
    logger.addHandler(file_error_handler)

    logger.info('Started')
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warn message')
    logger.error('error message')
    logger.critical('critical message')
    logger.info('Finished')

def main() :
    default_logger_test()
    custom_logger()

if __name__ == '__main__':
    main()

깔끔하고 좋구나.

이미지 붙여넣기도 될까?

이건 안되네..

file

아..된다!

syntax highlighting이 뭔가 좀 이상해보이지만.

일단은..그냥 고고

테스트 글은 여기까지!

Etc에 게시되었습니다

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다