gpt4 book ai didi

node.js - 捕获bunyan日志/查看bunyan记录器

转载 作者:太空宇宙 更新时间:2023-11-04 00:13:46 27 4
gpt4 key购买 nike

我有一个函数,它使用传递给它的bunyan 记录器进行日志记录。

全局记录器在整个应用程序中使用,为许多组件提供日志记录工具。这样我们就有了一个集中的日志。大多数时候,我们只是将这个全局记录器传递给所有需要它的函数。

但是,在某些情况下,当我调用上述函数时,我希望能够访问由该函数调用写入的日志,但同时我希望保持标准日志记录行为(即将日志写入集中式日志),因此我不能只向其传递新的记录器实例。

用bunyan解决这个问题的最佳方法是什么?

代码应该看起来像这样:

const funcCallLogger = globalLogger.cloneSomehow();

doSomeWork(funcCallLogger).then(() => {
const logs = funcCallLogger.getWritenLogs();
// logs should be an array of all logs written to funcCallLogger
// at the same time all logs written to funcCallLogger must also be
// reflected in globalLogger
});

function doSomeWork (logger) {
logger.info('Doing some work...');
await ...
}

我正在考虑创建一个子记录器并为其分配一个自定义流以进行日志收集,但我不确定这是否是最好的解决方案。

最佳答案

我决定创建一个子记录器并将其配置为使用自定义可写流,以便收集和处理写入其中的所有日志条目。这样,来自子记录器的所有日志都会流向全局记录器(因此这不会破坏正常的日志记录行为),同时我能够收集流式传输到此自定义实例的日志。

这是示例代码:

import * as stream from 'stream';


export class LogAccumulatingStream extends stream.Writable {

private logs: string[] = [];


public _write (chunk: any, encoding: string, callback: Function): void {
this.logs.push(chunk.toString());
callback();
}

public getLogs (): string[] {
return this.logs;
}

}

这是我的运行方式:

const childLogger = globalLogger.child({
component: 'SomeWorker'
});

const logsAccumulator = new LogAccumulatingStream();

const stream = new PrettyStream({ useColor: false });

stream.pipe(logsAccumulator);

childLogger.addStream({
level: 'debug',
type: 'raw',
stream
});

await someWorker.run(childLogger);

const workerLogs = logsAccumulator.getLogs();

我使用 PrettyStream 将日志格式化为字符串,然后将其通过管道传输到 LogAccumulatedStream,但如果需要,您可以直接使用 LogAccumulatedStream,只需重写它来处理对象而不是字符串。

我不确定这是否是最好的解决方案,因此非常欢迎发表评论和进一步的答案。

关于node.js - 捕获bunyan日志/查看bunyan记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48176633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com