728x90

에러 다루기

errorhandler를 사용하여 HTTP 오류 코드가 나오는 페이지를 정의할 수 있다.

 -> 에러코드를 넘겨주지 않으면 200 성공으로 인지함

1
2
3
4
5
6
7
8
9
10
from flask import Flask
import requests
 
app = Flask(__name__)
 
 
@app.errorhandler(404)
def page_not_found(error):
    return "<h1>404 Error</h1>"404
 
cs

->app. errorhandler의 인자로, 특정 에러코드를 받아서, 해당 에러코드일 때 특정 메시지를 출력하도록  에러코드를 다룰 수 있다.

 

 

로깅(logging) 다루기

- 서버는 24시간 동작하므로, 문제가 있을 때, 어떤 문제가 있었는지, 파악하기 위해 로깅 기능을 사용함.

- 코드에다가 구현 과정 동안의 내부 통신들을 직접 보고 싶을 때, 로깅 코드를 포스트잇처럼 딱 집어서 표시해 두면,

   후에 에러라던가 코드 구현 과정에서 어디에서 에러가 났는 지 등을 눈으로 확인 할 수 있는 기능을 제공한다,

- 따라서, 다양한 상용화시 문제에 대해서 로깅 기능을 자주 활용함.

 

logging 라이브러리 사용법

 - 파이썬에는 로그를 다루는 logging 라이브러리가 있음

 - 로딩 정보는 레벨이 있음

   -> 로그의 레벨에 따라서 출력을 제한 할 수 있음

  • DEBUG > INFO > WARNING > ERROR > Critical

  • critical로 갈 수록, 그 이슈가 심각한 것이다. 즉 이는 로그파일에 저장되는 레벨을 설정하는 것이다. 

  • 로그파일에 저장되는 레벨 수준을 정할 수 있는데, 모든 것을 저장하면 실행될때마다 저장하여 메모리 이슈가 발생할 수도 있다. 기본적으로 파이썬에서 로그파일을 사용하기 위헤 전반적으로 사용가능한 라이브러리이다.

로깅 라이브러리는 기본적으로 파이썬에서 로그파일을 사용하기 위헤 사용가능하다.

 

 

Logging Level

1
2
3
4
5
6
7
8
9
10
import logging
# 파일로 남기기 위해서는 filename='test.log' 파라미터, 어느 로그까지 남길 것인지를 level 로 설정 가능
logging.basicConfig(filename='test.log', level=logging.ERROR)
 
# 로그를 남길 부분에 다음과 같이 로그 레벨에 맞추어 출력해주면 해당 내용이 파일에 들어감
logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
cs

 

DEBUG - 상세한 정보

INFO - 일반적인 정보

WARNING - 예상치 못하거나 가까운 미래에 발생할 문제

ERROR - 에러 로그. 심각한 문제

CRITICAL - 프로그램 자체가 실행되지 않을 수 있음

  • 파이썬 로거 레벨 설정에 따라서 하위 레벨은 출력이 안된다.

  • 기본 로거 레벨 세팅은 WARNING이기 때문에 설정 없이 INFO, DEBUG를 출력 할 수 없다.

 

flask 와 logging

- logging 라이브러리와 함께 flask logging 기능 사용 가능

 

주요 logging 핸들러 

 

 - FileHandler :  파일로 로그를 저장

 - RotatingFileHandler : 파일로 로그를 저장하되, 파일이 정해진 사이즈를 넘어가면, 새로운 파일로 생성(실무에서 많이 쓰인다.)

  • maxBytes=하나의파일사이즈, backupCount=파일갯수

  • 전체 파일을 다 쓰면, 다시 처음부터 씀

  • 즉 씨씨티비 저장기한을 생각하면 된다. 최대 사이즈 기준으로 쪼개서 파일들을 만들어서 저장하다가 최대 사이즈가 넘어서 로그 파일이 저장되면, 다시 첫 파일부터 덮어쓰면서 로그 파일을 저장함.

  • NTEventLogHandler - 윈도우 시스템 로그로 남김

  • SysLogHandler - 유닉스 계열 시스템의 syslog 로 남김

서버 상에서는 로그 파일이 전체 디스크를 채울 경우, 비정상동작을 할 수 있으므로 RotatingFileHandler 가 일반적인 경우에는 적합

app.run(host="0.0.0.0", port="8080", debug=True)

  • 다음과 같이 작성해서, 상용화시에는 app.debug 를 False 로 놓고, 디버그 정보를 로그로 남기는 것이 일반적임
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
from flask import Flask
import requests
 
app = Flask(__name__)
 
if not app.debug: 
    # 즉 debug=true면 이는 false로서 아래 함수가 돌아간다.
    # 실제 상용화단계에서 로깅을 진행해라는 의미이다
    import logging
    from logging.handlers import RotatingFileHandler  
    # logging 핸들러에서 사용할 핸들러를 불러온다.
    file_handler = RotatingFileHandler(
        'dave_server.log', maxBytes=2000, backupCount=10)
    file_handler.setLevel(logging.WARNING)  
    # 어느 단계까지 로깅을 할지를 적어줌
    # app.logger.addHandler() 에 등록시켜줘야 app.logger 로 사용 가능
    app.logger.addHandler(file_handler)
 
 
@app.errorhandler(404)
def page_not_found(error):
    app.logger.error('이것은 중요한 에러입니다. page_not_found에서 일어났습니다.')
    return "<h1>해당 경로에 맞는 웹페이지가 없습니다. 문제가 지속되면, 죄송하지만 관리자에게 연락해주세요</h1>"404
 
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", port="8080", debug=False)
    #debug = true면 개발모드, false면 상용화된 모드
cs

-> 로그 파일이 저장되는 곳은, 프로젝트 실행을 위해 VSC에서 오픈한 해당 폴더를 절대 경로로 두고 로그 파일이 생성된다. 

 

 

주요한 데코레이터

 - before_first_request : 웹 application 기동 이후 가장 처음에 들어오는 HTTP 요청에서만 실행

 - before_request : HTTP 요청이 들어올 때마다 실행

     => before_first_request, before_request는 인자를 전달할 수는 없음
 - after_request : HTTP 요청 처리가 끝나고 브라우저에 응답하기 전에 실행

     => response 를 리턴해야 함

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
32
33
34
35
from flask import Flask
import requests
 
app = Flask(__name__)
 
 
@app.before_first_request
def before_first_request():
    print("flask 실행 후 첫 요청 때만 실행")
    # 즉 프린트문을 통해 어느 시점에서 첫요청이 일어나는지 확인
 
 
@app.before_request
def before_request():
    print("HTTP 요청이 들어올 때마다 실행")
    # 즉 프린트문을 통해 어느 시점에서 첫요청이 일어나는지 확인 
    # 라우팅 코드 직전에 실행
 
 
@app.after_request
def after_request(response):
    print("HTTP 요청 처리가 끝나고 브라우저에 응답하기 전에 실행")
    return response
    # 해당 요청이 발생하면 프린트문으로 확인하고, 응답 또한 보내줌.
    # 라우팅 코드 직후에
 
 
@app.route("/hello")
def hello():
    print('hello')
    return "<h1>Hello Flask!</h1>"
 
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", port="8080")
cs

위의 코드를 실행하면 아래와 같이 프린트문을 출력함.

 

**데코레이터 추가적인 설명 예시

 

Reference

woolbro.tistory.com/87

 

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

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

woolbro.tistory.com

 

728x90

+ Recent posts