如何在输出到控制台前获取Pino日志并存储到本地变量?
如何在Pino日志输出到控制台前将内容存入本地变量?
当然可以实现,不需要写入文件,通过自定义Pino的输出流就能捕获日志内容并存入本地变量,同时还能保留原有的控制台输出。
基础实现方案
直接创建一个自定义输出流,在日志被输出前解析并存储,同时转发到控制台:
import pino from 'pino'; // 用来存储日志的本地变量(数组形式,方便存多条日志) const capturedLogs = []; // 自定义输出流,实现write方法处理日志 const customStream = { write: (logLine) => { // Pino默认输出JSON格式的日志行,先解析成对象 const logData = JSON.parse(logLine); // 将日志对象存入本地变量 capturedLogs.push(logData); // 转发到控制台,保留原有输出 console.log(logLine); } }; // 创建logger实例,指定自定义流作为输出目标 const logger = pino({ level: 'info' }, customStream); // 测试日志输出 logger.info("in function x"); // 查看捕获到的日志 console.log('已捕获的日志:', capturedLogs);
保留美化输出的方案
如果你需要保留prettyPrint的美化效果,可以结合pino-pretty来处理控制台输出:
import pino from 'pino'; import pretty from 'pino-pretty'; const capturedLogs = []; // 创建美化输出的流 const prettyConsoleStream = pretty({ colorize: true, translateTime: 'YYYY-MM-DD HH:mm:ss' }); const customStream = { write: (logLine) => { const logData = JSON.parse(logLine); capturedLogs.push(logData); // 转发到美化流输出到控制台 prettyConsoleStream.write(logLine); } }; const logger = pino({ level: 'info' }, customStream); logger.info("in function x"); console.log('已捕获的日志:', capturedLogs);
说明
- 自定义流的
write方法会接收Pino输出的每一行日志(默认是JSON字符串),你可以在这里完成解析、存储的操作。 - 所有捕获的日志都存在内存中的
capturedLogs变量里,随时可以访问或处理。 - 这种方式完全不需要写入文件,所有操作都在内存中完成。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

