본문 바로가기

Programming

파이썬 로그 핸들링

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 

 

인공지능(AI) 기초 다지기

부스트코스 무료 강의

www.boostcourse.org

 

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