如何使 `winston` 日志库像 `console.log` 一样工作?
How to make `winston` logging library work like `console.log`?
winston 库非常适合传输和灵活性。我想用它来允许配置级别和重定向到文件,但想重现 console.log 格式化行为,但遇到麻烦。
这是我目前的情况:
const log = winston.createLogger({
level: 'debug',
format: format.combine(
format.timestamp({format: 'YYYY-MM-DD HH:mm:ss.SSS'}),
format.splat(),
format.colorize(),
format.printf(({level, message, label, timestamp}) => `${timestamp} ${label || '-'} ${level}: ${message}`),
),
transports: [
new winston.transports.Stream({
stream: process.stderr,
level: 'debug',
})
],
});
log.info("Hello, %s", "Bob"); // Works: outputs "Hello, Bob"
但这行不通:
log.info("Hello", "Bob");
log.info("Hello", 123, {someObj: 1});
我希望在 splat()
占用的对象之后添加所有无关对象,space 分隔,并最好使用 util.inspect()
.[=16 转换为字符串=]
我遇到了类似的问题,经过反复试验,我想我有一个您可能感兴趣的解决方案。正如我在上次更新中提到的,我们最终构建了自己的记录器。好吧,周末我将这个记录器发布到 npm,欢迎您查看。
它的输出应该与 console.log
大致相同。 如果您发现任何不一致之处,请告诉我。
而且它还有多种传输,你甚至可以通过自定义的,你甚至可以"wrap"控制台功能快速集成到你的项目中。
示例代码:
const {createLogger,wrapConsole,unwrapConsole} = require('@r3wt/log');
const log = createLogger({log_level:'info',transports:['console','file']});
wrapConsole(log);//wraps the console globally with the log instance, making integration into large existing project less painful
// NOTE: only the following 4 functions are wrapped.
console.log('hi!');
console.warn('warning');
console.error('error');
console.info('info');
unwrapConsole();//unwrap console globally
如果您有兴趣,您可以找到库 here 以及更多代码示例和基本文档,欢迎和鼓励具有功能和修复的 PR。代码是麻省理工学院的,所以你可以自由地创建自己的版本:-)
祝您好运,希望对您有所帮助。
回答我自己的问题。问题出在 format.splat
—— 纯 util.format 提供了一种更简单、更符合预期的行为。将 format.splat
替换为 utilFormatter
可解决问题:
const util = require('util');
function transform(info, opts) {
const args = info[Symbol.for('splat')];
if (args) { info.message = util.format(info.message, ...args); }
return info;
}
function utilFormatter() { return {transform}; }
我的问题中的示例如下所示:
const log = winston.createLogger({
level: 'debug',
format: format.combine(
format.timestamp({format: 'YYYY-MM-DD HH:mm:ss.SSS'}),
utilFormatter(), // <-- this is what changed
format.colorize(),
format.printf(({level, message, label, timestamp}) => `${timestamp} ${label || '-'} ${level}: ${message}`),
),
transports: [
new winston.transports.Stream({
stream: process.stderr,
level: 'debug',
})
],
});
log.info("Hello, %s", "Bob"); // Works: outputs "Hello, Bob"
log.info("Hello", "Bob"); // Works: outputs "Hello Bob"
log.info("Hello", 123, {someObj: 1}); // Works: outputs "Hello 123 { someObj: 1} "
winston 库非常适合传输和灵活性。我想用它来允许配置级别和重定向到文件,但想重现 console.log 格式化行为,但遇到麻烦。
这是我目前的情况:
const log = winston.createLogger({
level: 'debug',
format: format.combine(
format.timestamp({format: 'YYYY-MM-DD HH:mm:ss.SSS'}),
format.splat(),
format.colorize(),
format.printf(({level, message, label, timestamp}) => `${timestamp} ${label || '-'} ${level}: ${message}`),
),
transports: [
new winston.transports.Stream({
stream: process.stderr,
level: 'debug',
})
],
});
log.info("Hello, %s", "Bob"); // Works: outputs "Hello, Bob"
但这行不通:
log.info("Hello", "Bob");
log.info("Hello", 123, {someObj: 1});
我希望在 splat()
占用的对象之后添加所有无关对象,space 分隔,并最好使用 util.inspect()
.[=16 转换为字符串=]
我遇到了类似的问题,经过反复试验,我想我有一个您可能感兴趣的解决方案。正如我在上次更新中提到的,我们最终构建了自己的记录器。好吧,周末我将这个记录器发布到 npm,欢迎您查看。
它的输出应该与 console.log
大致相同。 如果您发现任何不一致之处,请告诉我。
而且它还有多种传输,你甚至可以通过自定义的,你甚至可以"wrap"控制台功能快速集成到你的项目中。
示例代码:
const {createLogger,wrapConsole,unwrapConsole} = require('@r3wt/log');
const log = createLogger({log_level:'info',transports:['console','file']});
wrapConsole(log);//wraps the console globally with the log instance, making integration into large existing project less painful
// NOTE: only the following 4 functions are wrapped.
console.log('hi!');
console.warn('warning');
console.error('error');
console.info('info');
unwrapConsole();//unwrap console globally
如果您有兴趣,您可以找到库 here 以及更多代码示例和基本文档,欢迎和鼓励具有功能和修复的 PR。代码是麻省理工学院的,所以你可以自由地创建自己的版本:-)
祝您好运,希望对您有所帮助。
回答我自己的问题。问题出在 format.splat
—— 纯 util.format 提供了一种更简单、更符合预期的行为。将 format.splat
替换为 utilFormatter
可解决问题:
const util = require('util');
function transform(info, opts) {
const args = info[Symbol.for('splat')];
if (args) { info.message = util.format(info.message, ...args); }
return info;
}
function utilFormatter() { return {transform}; }
我的问题中的示例如下所示:
const log = winston.createLogger({
level: 'debug',
format: format.combine(
format.timestamp({format: 'YYYY-MM-DD HH:mm:ss.SSS'}),
utilFormatter(), // <-- this is what changed
format.colorize(),
format.printf(({level, message, label, timestamp}) => `${timestamp} ${label || '-'} ${level}: ${message}`),
),
transports: [
new winston.transports.Stream({
stream: process.stderr,
level: 'debug',
})
],
});
log.info("Hello, %s", "Bob"); // Works: outputs "Hello, Bob"
log.info("Hello", "Bob"); // Works: outputs "Hello Bob"
log.info("Hello", 123, {someObj: 1}); // Works: outputs "Hello 123 { someObj: 1} "