일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 정렬
- MySQL
- mongoose
- Express
- Nest.js
- Dinosaur
- nestjs
- game
- 게임
- nodejs
- react
- 공룡게임
- cookie
- flask
- MongoDB
- Sequelize
- Bull
- JavaScript
- AWS
- typeORM
- 자료구조
- OCR
- jest
- Python
- dfs
- class
- TypeScript
- GIT
- Queue
- Today
- Total
포시코딩
Flask logging 기능을 통한 로깅 시스템 구현 본문
개요
프로젝트 요구 조건에 로깅 시스템 구현이 있었는데
그나마 로그 관련 경험이 있고 개인 프로젝트에도 로깅 시스템을 추가할 필요성을 느끼고 있던터라
내가 담당해서 진행하기로 했다.
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
https://hwangheek.github.io/2019/python-logging/
https://stackoverflow.com/questions/14888799/disable-console-messages-in-flask-server
'Python > Flask' 카테고리의 다른 글
Log 파일에 Ascii Art(아스키아트) 써먹기 (0) | 2022.12.07 |
---|---|
[Flask] 서버 2번 실행되는 문제 해결 (0) | 2022.12.07 |
Flask + JS, Ajax 파일 업로드 및 데이터 전송 (0) | 2022.12.06 |
[Flask + MySQL] CRUD using Pycharm (0) | 2022.12.01 |
POST, GET 요청에 따른 data 받기 (0) | 2022.11.15 |