포시코딩

Flask logging 기능을 통한 로깅 시스템 구현 본문

Python/Flask

Flask logging 기능을 통한 로깅 시스템 구현

포시 2022. 12. 7. 15:07
728x90

개요

프로젝트 요구 조건에 로깅 시스템 구현이 있었는데

그나마 로그 관련 경험이 있고 개인 프로젝트에도 로깅 시스템을 추가할 필요성을 느끼고 있던터라

내가 담당해서 진행하기로 했다.

 

Python Logger와 Flask Logger 중 선택해야 했는데 

나는 Flask Logger를 사용했다.

 

세팅 방법

# 1. logging, os import
import logging
import os

# 2. 로그 저장 폴더. 없을 시 생성
if not os.path.isdir('logs'):
  os.mkdir('logs')
  
# 3. 기본 설정된 werkzeug 로그 끄기
logging.getLogger('werkzeug').disabled = True

# 4. 저장위치, 레벨, 포맷 세팅
logging.basicConfig(filename = "logs/server.log", level = logging.DEBUG
                  # , datefmt = '%Y/%m/%d %H:%M:%S %p'  # 년/월/일 시(12시간단위)/분/초 PM/AM
                  , datefmt = '%Y/%m/%d %H:%M:%S'  # 년/월/일 시(24시간단위)/분/초
                  , format = '%(asctime)s:%(levelname)s:%(message)s')

1. logging, os import

로깅 기능을 사용하기 위해 logging을 import 해주고, 

2번에서 폴더 생성을 하기 위해 os를 import 해준다.

2. 로그 저장 폴더. 없을 시 생성

4번에서 로그를 저장하려면 logs 폴더가 만들어져 있어야 하는데, 

보통 git에는 logs 폴더 하위의 log 데이터들을 .gitignore를 통해 제외하고 올리기 때문에

logs 폴더가 git에 올라가지도 않고 그 때문에 clone 했을 시 logs 폴더가 없는 상태가 된다.

 

logs 폴더가 없는 상태에서 logs/server.log에 로그를 기록하려고 할 경우 

에러가 나기 때문에 

os.path.isdir을 통해 폴더가 있는지 체크해주고 없다면 os.mkdir을 통해 폴더를 만들어준다.

(폴더안의 폴더를 만들고 싶은 경우 mkdir이 아닌 다른 명령어를 써야한다.)

3. 기본 설정된 werkzeug 로그 끄기

Flask 서버를 실행하다보면 콘솔창에서 아래와 같은 로그를 본 적이 있을 것이다.

기록하기 괜찮은 정보도 있지만

css, js 파일들을 잘 불러왔다는 정보까지는 필요 없기 때문에 

해당 기능을 disabled 해주기로 했다.

4. 저장위치, 레벨, 포맷 세팅

logging.basicConfig를 통해 Flask Logger의 기본 세팅을 진행해준다.

저장위치에 저장할 파일명을 같이 명시.

 

레벨에 설정하는 값은 그 레벨부터 기록한다는 뜻이다. 

소규모 프로젝트고 아직 로깅 기능에 익숙치 않은 팀원들을 위해 DEBUG 레벨부터 저장하도록 하며

로그들을 INFO 레벨로 작성하게 안내하였다.

익숙해지면 위 상황에 따라 레벨을 사용해주는 것이 좋다.

포맷은 어떤식으로 기록될지는 세팅하는 부분인데, 

기록 시간에 대한 포맷도 지정해주어 내 입맛대로 나오게 커스텀했다.

 

사용예시

PORT = 5000
if __name__ == '__main__':
  app.logger.info("server on :: PORT="+str(PORT))
  app.run('0.0.0.0', port=PORT, debug=True, use_reloader=False)
@app.route('/')
def home():
  app.logger.info(f'[{request.method}] {request.path}')
  return render_template('main.html', component_name='boards')

 

서버 실행했을 때와 메인 페이지에 접속할 경우 위처럼 기록되게 세팅해봤다.

 

결과물

원하는대로 잘 기록되고 있다.

윗부분에 server on은 그냥 server on :: 하고 한줄로만 찍어내는게 심심해보여 아스키아트를 추가해봤다.

사용법은 [링크]

 

이렇게 로깅 시스템도 구현해봤는데 

내 개인프로젝트에서도 적용해야지 하고 맨날 생각하던걸

스파르타 팀프로젝트에서 먼저 적용하게 될줄은 몰랐다.

 

다만, 이번에는 Flask의 기본 내장 로깅 시스템을 사용했는데 

앞으로 진행될 Node.js 프로젝트에서는 winston 같은걸 사용하게 될걸 대비해 열심히 공부해놔야겠다.

 

 

 

 

참고한 사이트

https://woolbro.tistory.com/87

 

python logging 파이썬 로깅 (feat. Flask)

Logger Logging Level DEBUG - 상세한 정보 INFO - 일반적인 정보 WARNING - 예상치 못하거나 가까운 미래에 발생할 문제 ERROR - 에러 로그. 심각한 문제 CRITICAL - 프로그램 자체가 실행되지 않을 수 있음 DEBUG <

woolbro.tistory.com

https://hwangheek.github.io/2019/python-logging/

 

조금 더 체계적인 Python Logging

IntroductionPython으로 코드를 짤 때, 로그를 띄우는 방법으로 print('[*] Message')를 정말 많이 써 왔습니다. 군더더기 없고, 유연하고, dependency 없이 아무 위치에나 넣을 수 있다는 점이 좋았습니다. ‘

hwangheek.github.io

https://stackoverflow.com/questions/14888799/disable-console-messages-in-flask-server

 

Disable console messages in Flask server

I have a Flask server running in standalone mode (using app.run()). But, I don't want any messages in the console, like 127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 - ... H...

stackoverflow.com

728x90