如何使用pino-http与Express记录自定义错误信息?
问题:pino-http 替换默认错误日志消息为自定义错误内容
我们在应用中使用pino-http结合Express记录REST API请求日志。当发生错误时,我们会记录错误对象以获取问题详情,但pino-http在记录失败的HTTP请求信息时,错误消息被设置为“failed with status code 500”,该提示过于通用,无法提供有效信息,且未记录错误对象中的消息。
现有配置代码
// pino.ts import pino, { type LoggerOptions } from 'pino'; import http from 'pino-http'; const options: LoggerOptions = { }; options.timestamp = () => `,"time":"${new Date(Date.now()).toISOString()}"`; options.formatters = { level: (label) => { return { level : label.toUpperCase() }; }, }; const logger = pino(options); const httpLogger = http({ logger, }, serializers: { // Do not include extensive error message in log output err: (err) => err.message }, customErrorMessage: (_req, _res, err) => err.message, }); export { httpLogger };
//express.ts import express from 'express'; import { httpLogger } from './pino'; const app = express(); app.use(httpLogger); ...
我们期望pino-http记录错误对象中的消息而非“failed with status code 500”,请问这是否可行,还是pino-http的固有限制?
解决方案
这完全可行,并非pino-http的固有限制。你的配置已用到正确的customErrorMessage属性,但存在语法错误导致配置未生效——httpLogger配置对象中多了一个冗余的闭合大括号,导致serializers和customErrorMessage被识别为额外参数而非配置对象的属性。
修正后的配置代码
// pino.ts import pino, { type LoggerOptions } from 'pino'; import http from 'pino-http'; const options: LoggerOptions = {}; options.timestamp = () => `,"time":"${new Date(Date.now()).toISOString()}"`; options.formatters = { level: (label) => { return { level : label.toUpperCase() }; }, }; const logger = pino(options); const httpLogger = http({ logger, serializers: { // 仅保留错误消息,避免输出冗余栈信息 err: (err) => ({ message: err.message }) }, // 优先使用错误对象的message,无消息时兜底默认状态码提示 customErrorMessage: (_req, _res, err) => err.message || `failed with status code ${_res.statusCode}` }); export { httpLogger };
关键调整点
- 移除
logger属性后多余的闭合大括号,确保所有配置项属于同一个对象 - 调整
err序列化器,返回包含message的对象(直接返回字符串会破坏日志结构一致性) - 给
customErrorMessage添加兜底逻辑,避免错误对象无message字段时日志内容缺失
配套Express错误处理
需确保Express错误中间件正确将错误挂载到请求对象,让pino-http能捕获到错误信息:
// express.ts 新增错误处理中间件 app.use((err: Error, req: express.Request, res: express.Response, next: express.NextFunction) => { (req as any).err = err; res.status(500).json({ error: err.message }); next(); });
完成以上配置后,pino-http会自动用错误对象的message字段替代默认的通用提示,日志内容将包含具体错误信息。
内容的提问来源于stack exchange,提问作者Julio Martínez
相关产品推荐
相关产品推荐

