마크다운으로 글쓰기
마크다운으로 글쓰기 테스트 중…
코드 넣기 테스트
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()
깔끔하고 좋구나.
이미지 붙여넣기도 될까?
이건 안되네..
아..된다!
syntax highlighting이 뭔가 좀 이상해보이지만.
일단은..그냥 고고
테스트 글은 여기까지!