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

如何在Winston/Node.js中设置日志级别,node.js,express,winston,Node.js,Express,Winston,我在Node.js应用程序中使用Winston日志,并定义了文件传输。在整个代码中,我使用logger.error、logger.warn或logger.info进行记录 我的问题是,如何指定日志级别?是否有可以设置的配置文件和值,以便只记录适当的日志消息?例如,我希望日志级别在我的开发环境中为“info”,但在生产环境中为“error”。看起来在传递的选项中有一个级别选项 从该文件: var logger = new (winston.Logger)({ transports: [

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


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

看起来在传递的选项中有一个级别选项

从该文件:

var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({ level: 'error' }),
    new (winston.transports.File)({ filename: 'somefile.log' })
  ]
});
现在,这些示例显示如何将option对象中的级别传递给console传输。当您使用文件传输时,我相信您将传递一个options对象,该对象不仅包含文件路径,还包含级别

这将导致类似于:

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

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

winston中有6个默认级别:愚蠢=0(最低)、调试=1、详细=2、信息=3、警告=4、错误=5(最高)

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

new (winston.transports.File)({ filename: 'somefile.log', level: 'warn' })
上面的代码将日志级别设置为
警告
,这意味着
愚蠢
详细
信息
将不会输出到somefile.log,而
警告
调试
错误
将输出到somefile.log

您还可以定义自己的级别:

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个预定义级别,以防某个地方使用预定义级别。

您可以在运行时通过修改相应传输的
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';
我想,它对文件也有类似的作用,但我没有尝试过。

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

const winston = require('winston');
// ...
winston.level = 'debug';
将日志级别设置为“调试”。(使用winston 0.7.3进行测试,)

但是,使用适当的日志级别,然后使用该记录器:

const myLogger = winston.createLogger({
  level: 'debug'
});
myLogger.debug('hello world');
如果您已经在代码库中使用,则可能需要您使用以下新记录器替换所有用法:

const winston = require('winston');
// default logger
winston.log('debug', 'default logger being used');

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

如果要动态更改日志级别。例如,当您需要在短时间内跟踪生产问题时;然后恢复到错误日志级别。您可以使用动态记录器,前提是您可以在web上公开服务

bryanmac,谢谢您的回复,但我担心它仍然无法回答我的问题。让我澄清一下。在我以前的工作中,我们使用了一个定制的日志模块,它与winston featurewise非常相似。模块依赖于配置文件中设置日志级别的条目。如果我们必须调试任何问题,我们将更改配置文件中的条目,以增加日志的详细程度。但在其他时间,我们会将级别设置为最低级别,以便只记录错误。winston也可以这样做吗?上面的编程代码可以从日志文件中读取以设置初始日志记录级别。现在,要在运行时从初始/默认级别进行更改,您可以公开一个API,该API可以转换并调用我提到的setLevel方法。这样你就可以有一个管理页面来读取日志级别并设置它。布莱恩,我将接受你的初始答案+你的评论作为我问题的答案。谢谢。谢谢-如果您对如何使用它或它的效果有任何其他反馈或想法,我们将不胜感激。我现在正在经历同样的事情:)布莱恩,我一定会回来在这里分享我的实施细节。陈,谢谢你的回答。我已经接受了布莱恩上面的回答。但是你的也很有帮助。很抱歉,@Chen是错的。调试低于详细。建议编辑。@filsmick您是对的。我写这个答案时,Debug比verbose高,但现在verbose比verbose高。@Chen哦,不知道它曾经比verbose高。当我看到它时,我倾斜了,因为它没有意义,所以我测试了它:)一个级别是否可能只听到它自己的级别?没有任何级别的值大于它?但是只有它自己的级别?是的,这是正确的答案,其他的需要创建一个新的记录器,并且不调整winston创建的现有默认记录器的设置。这是最难找到的信息!谢谢@Andreaspizza@RudolfOlah正确的答案是文档推荐的,即创建一个新的记录器。在winston的github问题中,动态更改默认日志记录器(或任何其他已创建的日志实例)的日志级别已经讨论了无数次,结果是在大多数情况下——尽管它可能适用于最新版本,甚至是最新/最新版本——不这样做。不要仅仅因为答案更符合你的个人喜好就称之为“正确”。不过,winston周围有一些库提供了此功能。非常感谢,谢谢。介意分享一些指向这些库的链接或搜索词吗@鲁道夫拉霍,这很有趣——我无意中提到鲁道夫拉,而实际上我指的是@Num Lock。感谢你们的贡献和见解!