MST

星途 面试题库

面试题:Python日志记录与异常追踪之复杂场景处理

假设你正在开发一个Web应用,使用Flask框架。在处理用户请求过程中可能会出现多种异常,如数据库连接异常、参数解析异常等。请设计一个全面的日志记录与异常追踪方案,确保能准确记录异常发生的时间、请求信息、异常类型及详细堆栈信息,并且能方便地根据不同环境(开发、测试、生产)调整日志记录的详细程度。
38.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 安装日志相关库

    • Flask默认集成了Python的logging模块,无需额外安装。但如果需要更高级的功能,如结构化日志等,可以考虑安装structlog等库。
  2. 配置日志记录

    • 在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)
  1. 记录请求信息
    • 使用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
  1. 捕获和记录异常
    • 使用Flask的全局异常处理机制,捕获所有未处理的异常,并记录详细的堆栈信息。
@app.errorhandler(Exception)
def handle_exception(e):
    app.logger.error('Exception occurred during request handling', exc_info = True)
    # 可以根据不同的异常类型返回不同的响应
    return 'An error occurred', 500
  1. 结构化日志记录(可选)
    • 如果使用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

通过以上方案,可以实现全面的日志记录与异常追踪,并根据不同环境灵活调整日志详细程度。