使用带有同步日志记录的 pino 多流

问题描述 投票:0回答:3

据我了解,Pino(v 7.5.1)默认情况下会同步日志记录。来自文档

在 Pino 的标准操作模式中,日志消息直接写入输出流,因为消息是通过阻塞操作生成的。

我正在使用

pino.multistreams
,就像这样

const pino = require('pino')
const pretty = require('pino-pretty')
const logdir = '/Users/punkish/Projects/z/logs'

const streams = [
    {stream: fs.createWriteStream(`${logdir}/info.log`, {flags: 'a'})},
    {stream: pretty()},
    {level: 'error', stream: fs.createWriteStream(`${logdir}/error.log`, {flags: 'a'})},
    {level: 'debug', stream: fs.createWriteStream(`${logdir}/debug.log`, {flags: 'a'})},
    {level: 'fatal', stream: fs.createWriteStream(`${logdir}/fatal.log`, {flags: 'a'})}
]

奇怪的是,Pino 的行为是异步的。我有一个

curl
操作不按顺序输出(在使用
log.info
的早期事件之前)

log.info('1')
.. code to do 1 something

log.info('2')
.. code to do 2 something

log.info('3')
.. code to do 3 something

const execSync = require('child_process').execSync
execSync(curl --silent --output ${local} '${remote}')

我的

console
输出是

1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 39.5M  100 39.5M    0     0   108M      0 --:--:-- --:--:-- --:--:--  113M
2
3

这有点烦人和令人困惑。也许这不是皮诺的错,也许是

curl
造成了问题。但如果我用
console.log
替换 pino 日志记录,那么顺序就是预期的。所以问题似乎出在 Pino 的异步行为上。如何返回同步日志记录?

node.js curl pinojs
3个回答
5
投票

技巧是调用

pino.destination({...})
来创建 SonicBoom 输出流:
fs.createWriteStream
的 pino 特定替代方案。
SonicBoom
选项具有布尔属性
sync
。 您还需要
sync
中的
pretty({...})
选项。

const pino = require('pino')
const pretty = require('pino-pretty')
const logdir = '/Users/punkish/Projects/z/logs'

const createSonicBoom = (dest) => 
  pino.destination({dest: dest, append: true, sync: true})

const streams = [
    {stream: createSonicBoom(`${logdir}/info.log`)},
    {stream: pretty({
      colorize: true,
      sync: true,
    })},
    {level: 'error', stream: createSonicBoom(`${logdir}/error.log`)},
    {level: 'debug', stream: createSonicBoom(`${logdir}/debug.log`)},
    {level: 'fatal', stream: createSonicBoom(`${logdir}/fatal.log`)}
]

测试:

const log = pino({ level: 'info' }, pino.multistream(streams))

console.log('Before-Fatal')
log.fatal('Fatal')
log.error('Error')
log.warn('Warn')
console.log('After-Warn, Before-Info')
log.info('Info')
console.log('After-Info')

输出:

致命之前
[1234567890123] 致命(主机上为 1234567):致命
[1234567890127] 错误(主机上为 1234567):错误
[1234567890127] 警告(主机上为 1234567):警告
事后警告,事前信息
[1234567890128]信息(主机上1234567):信息
事后信息

0
投票

似乎使用

pino.multistream
(或多个传输,似乎与多流具有相同的效果)自动强制 pino 异步运行。没有办法解决这个问题。由于同步日志记录对我来说比速度更重要(在这个项目中),我将寻找替代的日志记录解决方案


0
投票

如果您有自定义,则获得最多支持的解决方案将不起作用

DestinationStream
因为 SonicBoom 仅适用于文件和文件描述符

Error: SonicBoom supports only file descriptors and files
© www.soinside.com 2019 - 2024. All rights reserved.