阅读量:2
Linux下Swagger日志记录的落地方案
一、先明确日志来源与范围
- Swagger UI / Swagger Editor 自身日志:作为前端静态服务,通常把访问与错误输出到Web服务器(Nginx/Apache)或systemd 日志(journald);若以Node.js http-server直接启动,则由其进程输出到控制台/标准输出。
- 被文档化的后端 API 日志:这才是业务请求的主体日志,建议在后端框架中统一记录(路径、方法、状态码、耗时、错误堆栈等),Swagger仅提供文档与测试入口,不直接承担业务日志写入。
- 容器化场景:日志由容器运行时接管,需通过docker logs或编排平台的日志驱动收集。
二、Node.js Express 集成 Swagger 的日志实践
- 使用morgan记录访问日志到文件,使用winston统一结构化输出到多目标(文件/控制台):
// 安装依赖
// 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'));
- 要点:将访问日志与业务日志分离;访问日志用morgan按combined格式写入文件,业务日志用winston输出JSON便于检索与聚合。
三、Python Flask 集成 Swagger 的日志实践
- 使用logging或Loguru记录请求与错误;Flask-Swagger/Flasgger提供文档能力,日志仍在后端记录:
# 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)
- 要点:将日志写入文件并配置滚动;在before_request中记录关键信息,便于审计与追踪。
四、Spring Boot 集成 Swagger 的日志实践
- 使用Logback/Log4j2配置日志级别与输出路径;在全局异常处理器中记录错误日志,并在 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 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 配置展示错误模型(略)
- 要点:通过logging.level控制DEBUG/INFO输出;在**@ExceptionHandler中记录堆栈与上下文**;在 Swagger 的components.schemas定义ErrorResponse并在globalResponses中引用,便于客户端理解错误格式。
五、运行与运维要点
- 日志轮转:为应用与访问日志配置logrotate,避免单文件过大,示例配置:
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 app app
}
- 容器日志:若以容器运行,使用docker logs
查看;生产建议接入ELK/Graylog 或云日志服务做检索与告警。 - 实时查看与检索:使用tail -f实时跟踪日志,配合grep过滤关键字(如ERROR、/api-docs)。
- 前端侧调试:在浏览器开发者工具 Console查看Swagger UI前端日志;若需更细粒度,可在swagger-ui-express中使用requestInterceptor/responseInterceptor打印请求与响应。
以上就是关于“Swagger在Linux环境下如何进行日志记录”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm