linux

Swagger在Linux环境下如何进行日志记录

小樊
43
2025-11-30 05:46:47
栏目: 智能运维

Linux下Swagger日志记录的落地方案

一、先明确日志来源与范围

二、Node.js Express 集成 Swagger 的日志实践

// 安装依赖
// npm i express swagger-ui-express swagger-jsdoc morgan winston

const express = require('express');
const swaggerJsDoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');
const morgan = require('morgan');
const winston = require('winston');
const fs = require('fs');
const path = require('path');

// 1) Winston 日志器
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
    new winston.transports.File({ filename: 'logs/combined.log' }),
    new winston.transports.Console({ format: winston.format.simple() })
  ]
});

// 2) 访问日志文件流
const accessLogStream = fs.createWriteStream(
  path.join(__dirname, 'logs', 'access.log'), { flags: 'a' }
);

const app = express();

// 3) 使用 morgan 写入访问日志;使用自定义中间件记录业务日志
app.use(morgan('combined', { stream: accessLogStream }));
app.use((req, res, next) => {
  const start = Date.now();
  res.on('finish', () => {
    const duration = Date.now() - start;
    logger.info({
      method: req.method, url: req.url, status: res.statusCode, durationMs: duration, ip: req.ip
    });
  });
  next();
});

// 4) Swagger
const swaggerOptions = {
  swaggerDefinition: {
    openapi: '3.0.0',
    info: { title: 'My API', version: '1.0.0' }
  },
  apis: ['./routes/*.js']
};
const swaggerDocs = swaggerJsDoc(swaggerOptions);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs));

app.listen(3000, () => logger.info('Server listening on 3000'));

三、Python Flask 集成 Swagger 的日志实践

# pip install flask flasgger loguru

from flask import Flask, request
from flasgger import Swagger
from loguru import logger

app = Flask(__name__)
app.config['SWAGGER'] = {'title': 'My API', 'uiversion': 3}
Swagger(app)

# 1) Loguru 写入文件(按大小滚动)
logger.add("logs/debug.log", rotation="500 MB", level="INFO")

# 2) 记录请求
@app.before_request
def log_request():
    logger.info(f"{request.method} {request.url} from {request.remote_addr}")

@app.route('/api-docs')
def api_docs():
    return "Swagger UI available at /apidocs"

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

四、Spring Boot 集成 Swagger 的日志实践

// application.yml
logging:
  level:
    root: INFO
    com.example.demo: DEBUG
  file:
    name: logs/app.log
  pattern:
    file: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"

// 全局异常与日志
@RestControllerAdvice
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handle(Exception ex) {
        logger.error("Unhandled exception", ex);
        ErrorResponse err = new ErrorResponse();
        err.setCode(500);
        err.setMessage("Internal server error");
        return ResponseEntity.status(500).body(err);
    }
}

// Swagger 配置展示错误模型(略)

五、运行与运维要点

/var/log/myapp/*.log {
  daily
  missingok
  rotate 7
  compress
  delaycompress
  notifempty
  create 0644 app app
}

0
看了该问题的人还看了