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
}