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

pun*_*ish 5 curl node.js pinojs

据我了解,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'})}
]
Run Code Online (Sandbox Code Playgroud)

奇怪的是,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}')
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

这有点烦人和令人困惑。也许这不是皮诺的错,也许curl才是问题的根源。但如果我用 pino 日志记录替换,console.log那么顺序就是预期的。所以问题似乎出在 Pino 的异步行为上。如何返回同步日志记录?

Joe*_*der 5

诀窍是调用pino.destination({...})创建SonicBoom输出流:特定于 pino 的fs.createWriteStream. 这些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`)}
]
Run Code Online (Sandbox Code Playgroud)

测试:

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')
Run Code Online (Sandbox Code Playgroud)

输出:

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