여태 FLASK_ENV=devlopment로 설정했지만 이러면 디버그 모드로 인해 오류 내용이 웹 브라우저 화면에 나타나 해킹등의 위험이 있으므로 production으로 변경해야한다.
# ~/venvs/myproject.env
FLASK_APP=pybo
FLASK_ENV=production
APP_CONFIG_FILE=/home/ubuntu/projects/myproject/config/production.py
이후 설정 적용을 위해 Gunicorn을 재시작한다
sudo systemctl restart myproject.service
# pybo/__init__.py
def page_not_found(e):
return render_template('404.html'), 404
# --------------------------------------------------------------------------- #
def create_app():
(... 생략 ...)
# --------------------------------- [edit] ---------------------------------- #
# 오류페이지
app.register_error_handler(404, page_not_found)
# --------------------------------------------------------------------------- #
return app
<!-- templates/404.html -->
{% extends 'base.html' %}
{% block content %}
<div class="container">
<div class="row justify-content-center">
<div class="col-12 text-center">
<span class="display-1 d-block">404</span>
<div class="mb-4 lead">페이지를 찾을 수 없습니다.</div>
<a href="/" class="btn btn-link">홈으로 돌아가기</a>
</div>
</div>
</div>
{% endblock %}
존재하지 않는 URL로 접근 시 아래처럼 나온다
프로덕션 환경에선 오류를 정확히 보여주지 않기 때문에 로깅을 사용해야한다
# config/production.py
dictConfig({
'version': 1,
'formatters': {
'default': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
}
},
'handlers': {
'file': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'logs/myproject.log'),
'maxBytes': 1024 * 1024 * 5, # 5MB
'backupCount': 5,
'formatter': 'default',
},
},
'root': {
'level': 'INFO',
'handlers': ['file']
}
})
파이썬 logging 모듈을 사용해 플라스크 로그를 설정할 수 있다.
'version': 1
logging 모듈이 업그레이드 되어도 현재 설정을 보장해준다
'formatters':
로그 출력 형식을 정의한다. default 포맷터를 등록했다
- asctime 현재시간
- level name 로그 레벨(debug, info, warning, error, critical)
- module 로그를 호출한 함수명
- message 출력 내용
'handlers' :
로그를 출력하는 방법을 정의한다. file 핸들러를 등록했다
- level 출력 로그 레벨 (INFO)
- class 로그 핸들러 클래스. RotatingFileHandler 파일크기가 설정한 값보다 커지만 파일 뒤에 인덱스를 붙여 백업, 로그 파일이 너무 커 디스크가 꽉 차는 위험을 방지
- filename 로그 파일명
- maxBytes 로그 파일 크기
- backupCount 로그 파일 개수
- formatter 포맷터, default 설정
'root' :
루트에 INFO 로그를 출력하도록 설정하고 이를 위해 file 핸들러 추가. 설정한 로그 레벨 이상의 로그만 출력된다.
logs 디렉토리를 추가하고 Gunicorn을 다시 시작하면 오류 발생 시 로그 파일에 기록된다.