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 的异步行为上。如何返回同步日志记录?
诀窍是调用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):信息 事后信息
| 归档时间: |
|
| 查看次数: |
5318 次 |
| 最近记录: |