如何将多文件中Pino的log.info内容写入统一文本文件?
实现Pino日志将所有log.info输出到指定文本文件
问题描述
当前使用Pino和Pino Pretty包,希望把项目中多个.ts文件里的所有log.info内容写入到一个通用文本文件,现有代码示例如下:
logger.ts
import pinoCaller from 'pino-caller' import pino from 'pino' const job_name="job123" const pinoPretty = pino( { prettyPrint: { messageFormat: `{"job_name":${job_name}, "message":{msg}}`, }, }) export const log=pinoCaller(pinoPretty)
file1.ts
import {log} from './logger' const calculatesum = (a:any,b:any)=>{ log.info('**********') log.info('sum begins') const sum=a+b; log.info('sum is '+sum) log.info('sum ends') }
file2.ts
import {log} from './logger' const calculateproduct = (a:any,b:any)=>{ log.info('product begins') const product=a*b; log.info('product is '+product) log.info('product ends') log.info('**********') }
期望文本文件输出格式:
*************** sum begins sum is x sum ends product begins product is y product ends ***************
可行实现方法
有两种直接的方式可以实现需求,以下是具体方案:
方法一:通过Pino文件流直接写入
修改logger.ts,创建文件写入流并调整日志格式,只保留消息内容:
import pinoCaller from 'pino-caller' import pino from 'pino' import fs from 'fs' import path from 'path' // 创建文件写入流,以追加模式写入,文件不存在则自动创建 const logFileStream = fs.createWriteStream(path.join(__dirname, 'app.log'), { flags: 'a' }) const logger = pino( { // 自定义格式,只输出log.info的原始消息内容 formatters: { log(object) { return object.msg } }, // 不需要时间戳的话可以禁用 timestamp: false }, // 指定日志输出到文件流 logFileStream ) export const log = pinoCaller(logger)
配置后,所有log.info的内容会直接追加到app.log文件中,无需额外处理格式。
方法二:结合Pino Pretty+命令行重定向
如果想保留Pino Pretty的格式化能力,同时将输出写入文件,可按以下步骤操作:
- 调整
logger.ts的格式配置,只保留消息内容并关闭颜色输出:
import pinoCaller from 'pino-caller' import pino from 'pino' const job_name="job123" const pinoPretty = pino( { prettyPrint: { messageFormat: '{msg}', // 只输出原始消息 colorize: false // 关闭颜色渲染,避免文件中出现ANSI控制码 }, }) export const log=pinoCaller(pinoPretty)
- 启动项目时通过命令行将输出重定向到文件:
node dist/index.js > app.log 2>&1
2>&1表示同时将错误输出也写入文件,若只需要log.info的内容,可仅重定向标准输出。
补充:匹配期望的首尾标记
如果需要自动在日志文件开头和结尾添加***************,可以在项目入口文件中添加对应日志调用:
import { log } from './logger' import { calculatesum } from './file1' import { calculateproduct } from './file2' // 日志开头标记 log.info('***************') // 执行业务逻辑 calculatesum(1,2) calculateproduct(3,4) // 日志结尾标记 log.info('***************')
内容的提问来源于stack exchange,提问作者Pavan Kumar
相关产品推荐
相关产品推荐

