面试题答案
一键面试-
安装日志相关库:
- Flask默认集成了Python的
logging
模块,无需额外安装。但如果需要更高级的功能,如结构化日志等,可以考虑安装structlog
等库。
- Flask默认集成了Python的
-
配置日志记录:
- 在Flask应用中创建一个日志配置函数,例如:
import logging
from flask import request
def setup_logging(app):
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
# 创建文件处理器,记录所有级别的日志
file_handler = logging.FileHandler('app.log')
file_handler.setFormatter(formatter)
# 创建控制台处理器,根据环境设置不同级别
console_handler = logging.StreamHandler()
if app.env == 'development':
console_handler.setLevel(logging.DEBUG)
elif app.env == 'testing':
console_handler.setLevel(logging.INFO)
else: # production
console_handler.setLevel(logging.WARNING)
console_handler.setFormatter(formatter)
app.logger.addHandler(file_handler)
app.logger.addHandler(console_handler)
app.logger.setLevel(logging.DEBUG)
- 在Flask应用的创建过程中调用这个函数:
from flask import Flask
app = Flask(__name__)
setup_logging(app)
- 记录请求信息:
- 使用Flask的请求钩子,在请求处理前和处理后记录相关信息。例如:
@app.before_request
def log_request_info():
app.logger.info('Request URL: %s, Method: %s', request.url, request.method)
app.logger.info('Request Headers: %s', request.headers)
if request.method in ['POST', 'PUT']:
app.logger.info('Request Body: %s', request.get_data(as_text = True))
@app.after_request
def log_response_info(response):
app.logger.info('Response Status Code: %s', response.status_code)
return response
- 捕获和记录异常:
- 使用Flask的全局异常处理机制,捕获所有未处理的异常,并记录详细的堆栈信息。
@app.errorhandler(Exception)
def handle_exception(e):
app.logger.error('Exception occurred during request handling', exc_info = True)
# 可以根据不同的异常类型返回不同的响应
return 'An error occurred', 500
- 结构化日志记录(可选):
- 如果使用
structlog
库,可以实现更灵活和易于查询的结构化日志记录。例如:
- 如果使用
import structlog
structlog.configure(
processors=[
structlog.processors.JSONRenderer()
]
)
logger = structlog.get_logger()
@app.before_request
def log_request_info_structured():
logger.info('request_started', url = request.url, method = request.method, headers = dict(request.headers))
if request.method in ['POST', 'PUT']:
logger.info('request_body', body = request.get_data(as_text = True))
@app.after_request
def log_response_info_structured(response):
logger.info('response_sent', status_code = response.status_code)
return response
@app.errorhandler(Exception)
def handle_exception_structured(e):
logger.error('exception_occurred', exc_info = True)
return 'An error occurred', 500
通过以上方案,可以实现全面的日志记录与异常追踪,并根据不同环境灵活调整日志详细程度。