MST

星途 面试题库

面试题:Python RESTful API中日志记录的优化策略

假设你正在开发一个高并发的Python RESTful API,如何优化日志记录以确保性能不受太大影响?请阐述在日志级别设置、日志输出格式、日志文件管理等方面的优化策略,并说明如何使用Python的logging模块实现这些优化。
15.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

日志级别设置

  1. 生产环境:将日志级别设置为 logging.INFOlogging.WARNING,避免记录大量低级别(如 logging.DEBUG)的日志信息。例如:
import logging

logging.basicConfig(level=logging.INFO)
  1. 开发环境:可以设置为 logging.DEBUG 以方便调试,但在上线前务必调整为合适的生产级别。

日志输出格式

  1. 简洁格式:采用简洁的日志格式,减少不必要的信息输出。例如:
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')
  1. JSON格式:如果需要更好的机器可读性和后续的日志分析,可采用JSON格式输出。借助 python-json-logger 库实现:
import logging
from pythonjsonlogger import jsonlogger

logger = logging.getLogger(__name__)
logHandler = logging.StreamHandler()
formatter = jsonlogger.JsonFormatter()
logHandler.setFormatter(formatter)
logger.addHandler(logHandler)

日志文件管理

  1. 按时间滚动:使用 TimedRotatingFileHandler 按时间(如每天)滚动日志文件,避免单个日志文件过大。
import logging
from logging.handlers import TimedRotatingFileHandler

logger = logging.getLogger(__name__)
handler = TimedRotatingFileHandler('app.log', when='D', interval=1, backupCount=7)
logger.addHandler(handler)
  1. 按大小滚动:使用 RotatingFileHandler 按文件大小滚动日志文件。
import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger(__name__)
handler = RotatingFileHandler('app.log', maxBytes=1024*1024, backupCount=5)
logger.addHandler(handler)

使用Python的logging模块实现优化

  1. 配置日志记录器
import logging

# 创建日志记录器
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

# 创建控制台处理器
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

# 创建文件处理器
fh = logging.FileHandler('app.log')
fh.setLevel(logging.INFO)

# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)

# 添加处理器到日志记录器
logger.addHandler(ch)
logger.addHandler(fh)
  1. 在API代码中使用日志记录器
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    logger.info('Received request for index page')
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()