如何在Strapi v4日志中打印客户端IP、请求体及User-Agent?
解决Strapi自定义日志缺失IP、请求体和User-Agent的问题
1. 修改日志中间件配置,自定义日志格式
在项目的config/middlewares.js文件中,找到strapi::logger中间件项,通过扩展format配置来获取请求上下文的额外信息:
module.exports = [ // 其他中间件... { name: 'strapi::logger', config: { format: (ctx, format) => { // 获取客户端IP:优先取反向代理传递的X-Forwarded-For,否则用ctx.ip const clientIp = ctx.headers['x-forwarded-for'] ? ctx.headers['x-forwarded-for'].split(',')[0].trim() : ctx.ip; // 获取User-Agent,无值时显示Unknown const userAgent = ctx.headers['user-agent'] || 'Unknown'; // 获取请求体:仅针对POST/PUT/PATCH这类带请求体的方法 const requestBody = ['POST', 'PUT', 'PATCH'].includes(ctx.method) ? JSON.stringify(ctx.request.body) : ''; // 构造时间戳,格式化为YYYY-MM-DD HH:MM:SS const timestamp = new Date().toISOString().replace('T', ' ').slice(0, 19); const logLevel = format.level; const method = ctx.method; const url = ctx.url; const status = ctx.status; const responseTime = ctx.responseTime; // Strapi默认提供的响应时间 // 拼接成目标日志格式 return `[${timestamp}] - [${logLevel}] - [${clientIp}] - [${method} ${url} ${requestBody ? `- REQUEST_BODY(${requestBody})` : ''} RESPONSE TIME(${responseTime}ms) - ${status}] [${userAgent}]`; }, }, }, // 其他中间件... ];
2. 关键注意点
- 反向代理适配:如果Strapi部署在Nginx等反向代理后,要确保代理服务器传递
X-Forwarded-For头,否则ctx.ip会拿到代理服务器IP而非客户端真实IP。 - 请求体解析顺序:确保
strapi::bodyparser中间件在strapi::logger之前执行(Strapi默认顺序已满足),否则ctx.request.body会为空。 - 大请求体处理:如果请求体过大,可给
JSON.stringify添加截取逻辑,比如JSON.stringify(ctx.request.body).slice(0, 200)避免日志过于冗长。
3. 验证效果
启动Strapi服务后,发送GET、POST等不同请求,控制台日志会按照你要求的格式输出,包含客户端IP、请求体(POST请求时)和User-Agent信息。
内容的提问来源于stack exchange,提问作者Shivam Som
相关产品推荐
相关产品推荐

