728x90
반응형
Logging이란
- 프로그램이 실행되는 동안 일어나는 정보를 기록으로 남기는 것
- 남겨야 하는 기록의 종류로는 유저의 접근, 프로그램의 Exception, 특정 함수의 사용 등이 있다.
- 남기는 방법으로는 console 화면에 출력하거나 파일 또는 DB에 남길 수 있다.
- 기록된 로그를 분석해서 의미있는 결과를 도출할 수 있으며, 실행시점 또는 개발시점에 남겨야 하는 기록은 상이할 수 있다.
Print로 하면 되지 않을까?
- print를 이용해서는 console 창에만 출력할 수 있는데 이후 분석에는 사용할 수 없다.
- 개발이나 운영 레벨별 / 또는 모듈별로 기록을 남길 필요도 있는데 이러한 기능을 체계적으로 지원하는 모듈을 사용해서 logging을 남겨야 한다.
Logging Level
- 프로그램의 진행 상황에 따라 다른 level의 log를 출력한다.
- 개발 시점, 운영 시점마다 다른 Log가 남을 수 있도록 지원한다.
- 심각성의 정도는 Debug -> Info -> Warning -> Error -> Critical 로 진행된다.
- Log 관리시 가장 기본이 되는 설정 정보라고 볼 수 있다.
Level | 개요 | 예시 |
Debug | 개발시 처리 기록을 남겨야 하는 로그 | 다음 함수로 a를 호출 변수 b를 c로 변경 |
Info | 처리가 진행되는 동안 정보 | 서버가 시작됨 서버가 종료됨 사용자 A가 프로그램에 접속함 |
Wargnig | 사용자가 잘못 입력한 정보. 또는 처리는 가능하지만 원래 개발 시 의도치 않는 정보가 들어왔을 때 알림 | string을 기대했지만 int가 입력됨 => str casting으로 처리 함수에 argument로 이차원 리스트를 기대했지만 일차원 리스트가 들어옴 => 이차원으로 변환 후 처리 |
Error | 잘못된 처리로 에러가 발생했지만 프로그램은 동작할 수 있음을 알림 | 파일에 기록해야 하는데 파일이 없음 |
Critical | 잘못된 처리로 데이터 손실이나 더 이상 프로그램이 동작할 수 없음을 알림 | 잘못된 접근으로 해당 파일이 삭제됨 사용자에 의한 강제 종료 |
기본 예제
import logging
logging.debug('틀렸잖아') # 개발
logging.info('확인해') # 운영
logging.warning('조심해!') # 사용자
logging.error('에러났어')
logging.critical('망했다..')
import logging
logger = logging.getLogger('main')
# 표시되는 기본 로그 레벨을 변경할 수 있다
logging.basicConfig(level=logging.DEBUG)
logger.setLevel(logging.INFO)
# 출력장소 설정 stream handler
stream_handler = logging.FileHandler(
'my.log', mode='w', encoding='utf8'
)
logger.addHandler(stream_handler)
logger.debug('틀렸잖아') # 개발
logger.info('확인해') # 운영
logger.warning('조심해!') # 사용자
logger.error('에러났어')
logger.critical('망했다..')
파이썬의 설정
실제 프로그램을 실행할 땐 여러 설정이 필요하다.
데이터 파일 위치, 파일 저장 장소, Operation type등이 있을 수 있겠다.
configparse
- 프로그램 실행 설정을 file에 저장한다.
- Section, Key, Value 값의 형태로 설정된 설정 파일을 사용한다.
- 설정 파일을 Dict type으로 호출 후 사용할 수 있다
example.cfg
[SectionOne]
Status : Single
Name: Derek
Value: Yes
Age: 39
Single: True
[SectionTwo]
FavoriteColor = Green
[SectionThree]
Familyname: Johnson
사용
import configparser
config = configparser.ConfigParser()
config.read('example.cfg')
config.sections()
print(config.sections())
for key in config['SectionOne']:
value = config['SectionOne'][key]
print(f'{key}: {value}')
출력
argparser
- console 창에서 프로그램 실행시 setting 정보를 저장
- 거의 모든 console 기반 python 프로그램 기본으로 제공한다
- 특수모듈(abseil)도 많이 존재하지만 일반적으로 argparse를 사용한다.
- command-line option 이라고 부른다
import argparse
parser = argparse.ArgumentParser(description='Sum to integers')
parser.add_argument(
'-a', '--a_value',
dest='a', help='A integer', type=int, required=True
)
# 짧은 이름/ 긴이름/ dest: 표시명 / help : help설명 / type : argment type
parser.add_argument(
'-b', '--b_value', dest='b', help='B integer',
type=int, required=True
)
args = parser.parse_args()
print(args)
print(args.a)
print(args.b)
print(args.a + args.b)
Logging에 paraser를 적용 해 보자
logging.conf
[loggers]
keys=root
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatters=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%m/%d/%Y %I:%M:%S %p
import logging
import logging.config
import csv
logging.config.fileConfig('logging.conf')
logger = logging.getLogger()
line_counter = 0
data_header = []
employee = []
customer_USA_only_list = []
customer = None
logger.info(f'Open file {"TEST"}')
try:
with open('customer.csv', 'r') as customer_data:
customer_reader = csv.reader(
customer_data, delimiter=',', quotechar='"'
)
for customer in customer_reader:
if customer[10].upper() == 'USA':
logger.info(f'ID {customer[0]} added')
customer_USA_only_list.append(customer)
except FileNotFoundError as e:
logger.error(f'File Not Found {e}')
logger.info(f'Write USA only data at {"customer_USA_only.csv"}')
with open('customer_USA_only.csv', 'w') as customer_USA_only_csv:
for customer in customer_USA_only_list:
customer_USA_only_csv.write(','.join(customer).strip('\n')+'\n')
logger.info('Program finished')
boost 코스의 인공지능 기초 다지기 강좌를 듣고 정리한 내용입니다.
https://www.boostcourse.org/ai100/lecture/739173?isDesc=false
728x90
반응형
'Programming' 카테고리의 다른 글
[Ray]1. 시작하며 (0) | 2022.10.05 |
---|---|
Python functools 모듈의 내장함수[기본] (0) | 2022.08.06 |
파이썬 예외처리 (0) | 2022.08.01 |
Black을 이용한 코드 스타일 맞추기 (0) | 2022.07.14 |
[Library] Dask 추가 정보 및 테스트 (0) | 2022.07.10 |