如何将Fastify日志格式化为logfmt格式
如何让Fastify输出logfmt格式日志
当然可以实现,Fastify的日志系统支持高度自定义,通过配置自定义的日志格式化逻辑就能输出logfmt格式的日志,以下是两种可行方案:
方案一:手动实现logfmt序列化
直接在Fastify的logger配置中编写格式化函数,将日志对象转换为logfmt格式的字符串:
const fastify = require('fastify')({ logger: { // 自定义请求/响应的序列化规则,按需调整 serializers: { req: (req) => ({ method: req.method, url: req.url, hostname: req.hostname, remoteAddress: req.ip }), res: (res) => ({ statusCode: res.statusCode }) }, formatters: { // 将日志级别转为键值对 level: (label) => ({ level: label }), // 核心:把日志对象转为logfmt格式字符串 log: (obj) => { return Object.entries(obj) .map(([key, value]) => { // 字符串类型的值添加引号,符合logfmt规范 const formattedVal = typeof value === 'string' ? `"${value}"` : value; return `${key}=${formattedVal}`; }) .join(' '); } } } }); // 测试日志输出 fastify.get('/', async (req, res) => { req.log.info({ user: 'john_doe', action: 'dashboard_access' }, 'User accessed dashboard'); return { status: 'ok' }; }); fastify.listen({ port: 3000 }, (err) => { if (err) { fastify.log.error(err); process.exit(1); } });
方案二:使用logfmt库简化实现
如果不想手动处理格式细节,可以借助logfmt库来完成序列化:
- 先安装依赖:
npm install logfmt
- 配置Fastify的logger:
const logfmt = require('logfmt'); const fastify = require('fastify')({ logger: { serializers: { req: (req) => ({ method: req.method, url: req.url, remoteAddress: req.ip }), res: (res) => ({ statusCode: res.statusCode }) }, formatters: { level: (label) => ({ level: label }), // 直接用logfmt库的stringify方法转换日志对象 log: (obj) => logfmt.stringify(obj) } } }); // 测试代码同方案一
关键说明
Fastify的logger.formatters.log函数负责将日志对象转换为最终输出的字符串,只要在这里实现logfmt格式的转换逻辑即可。serializers配置可以帮助你过滤掉请求/响应对象中的冗余字段,只保留业务需要的日志信息。
内容的提问来源于stack exchange,提问作者n0nvme
相关产品推荐
相关产品推荐

