[DAY 5] Log Handling
Logging Handling
- Logging: 로그 남기기
- 프로그램이 실행되는 동안 일어나는 정보를 기록을 남기기 (현재 상황 기록)
- 유저의 접근, 프로그램의 Exception, 특정 함수의 사용
- Console 화면에 출력, 파일에 남기기, DB에 남기기 등등
- 기록된 로그를 분석하여 의미있는 결과를 도출 할 수 있음
- 실행시점에서 남겨야 하는 기록: 유저분석
- 개발시점에서 남겨야하는 기록: 에러잡기, 디버깅 쉽게하기
print vs logging
- 기록을 print로 남기는 것도 가능함
- 그러나 Console 창에만 남기는 기록은 분석시 사용불가(콘솔창 끄면 사용 불가)
- 때로는 레벨별(개발, 운영등… 어떤 레벨에 속하는 지에 따라)로 기록을 남길 필요도 있음
- 모듈별로 별도의 logging을 남길필요도 있음
- 이러한 기능을 체계적으로 지원하는 모듈이 필요함
logging 모듈
Python의 기본 Log 관리 모듈
1 2 3 4 5 6
import logging logging.debug("틀렸잖아!") logging.info("확인해") logging.warning("조심해!") logging.error("에러났어!!!") logging.critical ("망했다...")
Logging Level
- 프로그램 진행 상황에 따라 다른 Level의 Log를 출력함
- 개발 시점, 운영 시점 마다 다른 Log가 남을 수 있도록 지원함
- DEBUG(개발자) > INFO(운영) > WARNING(사용자~) > ERROR > Critical
- Log 관리시 가장 기본이 되는 설정 정보 관리하기 위함
Log가 하는 일
- log는 print가 하는 일과 거의 유사
- debug 개발시 처리 기록을 남겨야하는 로그 정보를 남김
- info 처리가 진행되는 동안의 정보를 알림(프로그램 시작, 종료…)
- warning 사용자가 잘못 입력한 정보나 처리는 가능하나 원래 개발시 의도치 않는 정보가 들어왔을 때 알림.
- 더이상 쓰면 안될때: depreciate
- error 잘못된 처리로 인해 에러가 났으나, 프로그램은 동작할 수 있음을 알림
- critical 잘못된 처리로 데이터 손실이나 더이상 프로그램이 동작할 수 없음을 알림
- 아래와 같이 실제 프로그램을 실행할 때는 여러 설정이 필요
- 데이터 파일 위치, 파일 저장 장소, operation type등
이러한 정보를 설정해 줄 방법이 필요
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
import logging logger = logging.getLogger("main") # logger 선언 stream_hander = logging.StreamHandler() # logger의 output 방법 선언 logger.addHandler(stream_hander) logger의 # output 등록 logger.debug("틀렸잖아!") logger.info("확인해") logger.warning("조심해!") # 여기부터서만 뜬다 logger.error("에러났어!!!") logger.critical("망했다...") # logger.setLevel(logging.DEBUG) # 이유는 기본 로깅 레벨이 warning 이상이므로.. # 왜냐면 operation에서 사용자에게 알려주는 레벨 ##### import logging logger = logging .getLogger("main") logging.basicConfig(level = logging.DEBUG) # 기본세팅 logger.setLevel(logging.INFO) # 레벨 변경 # 3.8 이상 부터는 두개를 함께 써야함 # 출력을 어디에 할 것인가 : my.log에 해줄 것/append mode # steam_handler = logging.FileHandler("my.log", mode="a", encoding="utf=8") # logger.addHandler(steam_handler) logger.debug("틀렸잖아!") logger.info("확인해") logger.warning("조심해!") # 여기부터서만 뜬다 logger.error("에러났어!!!") logger.critical("망했다...")
Logging 적용하기
- Logging formmater
- formatter 사용
Log의 결과값의 format을 지정해줄 수 있음
1 2 3 4 5 6 7 8 9 10
""" formatter = logging.Formatter('%(asctime)s %(levelname)s %(process)d %(message)s') 2018-01-18 22:47:04,385 ERROR 4410 ERROR occurred 2018-01-18 22:47:22,458 ERROR 4439 ERROR occurred 2018-01-18 22:47:22,458 INFO 4439 HERE WE ARE 2018-01-18 22:47:24,680 ERROR 4443 ERROR occurred 2018-01-18 22:47:24,681 INFO 4443 HERE WE ARE 2018-01-18 22:47:24,970 ERROR 4445 ERROR occurred 2018-01-18 22:47:24,970 INFO 4445 HERE WE ARE """
Log config file 사용하여 format 불러오기
1 2 3 4
""" logging.config.fileConfig('logging.conf') logger = logging.getLogger() """
log의 세팅, 사전에 세팅설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
""" [loggers] keys=root [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [Handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout, ) """
1 2 3 4 5 6 7 8 9 10
logger.info('Open file {0}'.format("customers.csv",)) try: with open("customers.csv", "r") as customer_data: customer_reader = csv.reader(customer_data, delimiter=',', quotechar='"') for customer in customer_reader: if customer[10].upper() == "USA": #customer 데이터의 offset 10번째 값 logger.info('ID {0} added'.format(customer[0],)) customer_USA_only_list.append(customer) #즉 country 필드가 “USA” 것만 except FileNotFoundError as e: logger.error('File NOT found {0}'.format(e,))