如何在Winston/Node.js中设置日志级别

31

我正在使用Winston日志记录我的Node.js应用程序,并定义了一个文件传输。在我的代码中,我使用 logger.errorlogger.warnlogger.info 进行日志记录。

我的问题是,如何指定日志级别?是否有配置文件和值可以设置,以便仅记录适当的日志消息?例如,在开发环境中,我希望日志级别为“info”,但在生产环境中为“error”。

6个回答

37

如果您正在使用默认记录器,您可以像这样调整日志级别:

const winston = require('winston');
// ...
winston.level = 'debug';

将日志级别设置为“debug”(已在winston 0.7.3中进行了测试,默认日志记录器在3.2.1中仍然存在)。

但是,文档建议创建具有适当日志级别的新日志记录器,然后使用该记录器

const myLogger = winston.createLogger({
  level: 'debug'
});
myLogger.debug('hello world');
如果您已经在代码库中使用了默认记录器,则可能需要将所有用法替换为您正在使用的新记录器: the default logger
const winston = require('winston');
// default logger
winston.log('debug', 'default logger being used');

// custom logger
myLogger.log('debug', 'custom logger being used');

2
是的,这是正确的答案,其他答案需要创建一个新的记录器并且不会调整由winston创建的现有默认记录器的设置。 - user9903
1
这是最难找到的信息之一!感谢@AndreasPizsa! - Adrian Lynch
2
@RudolfOlah 正确的答案是文档推荐的,即创建一个新的记录器。动态更改默认记录器(或任何其他已创建的日志记录实例)的日志级别在winston的github问题中已经讨论了无数次,结果在大多数情况下 - 尽管它可能适用于大多数甚至最近/当前版本 - 不要这样做。不要仅仅因为答案符合您的个人喜好而将其称为“正确”的答案。但是有一些库包装了winston,提供了这种功能。 - Num Lock
1
感谢您,能否分享一些这样的库的链接或搜索词?@RudolfOlah - AndreasPizsa
哦,这很有趣 - 我不小心提到了RudolfOlah,实际上我想说的是@Num Lock。感谢你们两位的贡献和见解! - AndreasPizsa

25

看起来在传递的选项中涵盖了一个级别选项,此处有相关说明。

根据该文档:

var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({ level: 'error' }),
    new (winston.transports.File)({ filename: 'somefile.log' })
  ]
});

现在,这些示例展示了将级别传递到控制台传输的选项对象中。当您使用文件传输时,我相信您将传递一个选项对象,该对象不仅包含文件路径,还包括级别。

这应该会导致类似于以下内容:

var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.File)({ filename: 'somefile.log', level: 'error' })
  ]
});

根据该文档,还要注意从2.0开始,它公开了一个setLevel方法来在运行时更改。请查看该文档中的使用日志级别部分。


1
bryanmac,感谢您的回复,但我担心它仍然没有回答我的问题。让我澄清一下。在我以前的工作中,我们使用了一个类似于winston的自定义日志记录模块。该模块依赖于配置文件中的条目来设置日志级别。如果我们需要调试任何问题,我们会更改配置文件中的条目,以增加日志的详细程度。但在其他时间,我们会将级别设置为最低级别,以仅记录错误。使用winston是否可能实现这样的功能? - Silent User
1
上面的编程代码可以从日志文件中读取以设置初始日志级别。现在,为了在运行时从初始/默认级别更改,您可以公开一个API,然后调用我提到的setLevel方法。这样,您就可以拥有一个管理页面来读取日志级别和设置它的方式。 - bryanmac
Bryan,我将接受你的初始答案和评论作为我的问题的答案。谢谢。 - Silent User
谢谢 - 如果您对使用它的反馈或想法有任何其他意见,我们将不胜感激。我现在正在进行同样的事情 :) - bryanmac
Bryan,我一定会回来在这里分享我的实现细节。 - Silent User
Bryan,我最终采用了这篇帖子的解决方案(与您的解决方案非常相似):https://dev59.com/zmsy5IYBdhLWcg3wxAyO - Silent User

8

winston有6个默认日志级别:silly=0(最低),debug=1,verbose=2,info=3,warn=4,error=5(最高)

在创建记录器传输时,您可以指定日志级别,例如:

new (winston.transports.File)({ filename: 'somefile.log', level: 'warn' })

以上代码将日志级别设置为warn,这意味着sillyverboseinfo不会输出到somefile.log文件中,而warndebugerror会输出。
您还可以定义自己的级别:
var myCustomLevels = {
  levels: {
    foo: 0,
    bar: 1,
    baz: 2,
    foobar: 3
  }
};

var customLevelLogger = new (winston.Logger)({ levels: myCustomLevels.levels });
customLevelLogger.foobar('some foobar level-ed message');

请注意,在自定义级别中始终包含这6个预定义级别,以防止其他地方使用了预定义级别。

陈,谢谢你的回答。我已经接受了Bryan在上面的回答。但你的回答也很有帮助。 - Silent User
3
很抱歉,但 @Chen 是错的。Debug 级别低于 verbose。建议进行编辑。 - Yohaï-Eliel Berreby
@filsmick 你是对的。当我写这个答案时,调试级别比冗长级别高,但现在冗长级别更高了。 - Chen
@Chen Oh,我之前不知道它曾经更高。当我看到这个时,我感到很困惑,所以我进行了测试 :) - Yohaï-Eliel Berreby
一个级别是否只能听到它自己的级别?而不是任何值大于它的级别?但仅限于它自己的级别? - Gaurav

3

您可以通过修改适当传输的level属性,在运行时更改日志记录级别:

var log = new (winston.Logger)({
    transports: [
        new (winston.transports.Console)({ level : 'silly' })
    ]
});

...

// Only messages with level 'info' or higher will be logged after this.
log.transports.Console.level = 'info';

我猜文件也是类似的操作,但我还没有尝试过。


0

0

除此之外,您可以通过实现runtime-node-refresh来轻松实现此目标。请参考link了解更多信息。


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。- 来自审查 - L8R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接