据我了解,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 的异步行为上。如何返回同步日志记录?
技巧是调用
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):信息 事后信息
似乎使用
pino.multistream
(或多个传输,似乎与多流具有相同的效果)自动强制 pino 异步运行。没有办法解决这个问题。由于同步日志记录对我来说比速度更重要(在这个项目中),我将寻找替代的日志记录解决方案
如果您有自定义,则获得最多支持的解决方案将不起作用
DestinationStream
因为 SonicBoom 仅适用于文件和文件描述符
Error: SonicBoom supports only file descriptors and files