[오늘의 배움] 033 플라스크 운영

이상민·2021년 1월 19일
0

[오늘의 배움]

목록 보기
36/70
post-thumbnail

1. 운영 환경으로 배포하기

여태 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

2. 서비스답게 오류 페이지 다듬기

# 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로 접근 시 아래처럼 나온다

3. 플라스크 로깅 적용하기

프로덕션 환경에선 오류를 정확히 보여주지 않기 때문에 로깅을 사용해야한다

# 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을 다시 시작하면 오류 발생 시 로그 파일에 기록된다.

profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글