You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:56:03