如何在 Winston/Node.js 中设置日志级别
Posted
技术标签:
【中文标题】如何在 Winston/Node.js 中设置日志级别【英文标题】:How to set log level in Winston/Node.js 【发布时间】:2013-03-10 06:41:27 【问题描述】:我在我的 Node.js 应用程序中使用 Winston 日志记录并定义了文件传输。在我的整个代码中,我使用logger.error
、logger.warn
或logger.info
登录。
我的问题是,如何指定日志级别?是否有我可以设置的配置文件和值,以便只记录适当的日志消息?例如,我希望日志级别在我的开发环境中为“信息”,但在生产环境中为“错误”。
【问题讨论】:
【参考方案1】:如果您使用的是默认记录器,您可以像这样调整日志级别:
const winston = require('winston');
// ...
winston.level = 'debug';
将日志级别设置为“调试”。 (使用 winston 0.7.3 测试,default logger is still around in 3.2.1)。
但是,the documentation recommends creating a new logger 具有适当的日志级别,然后使用该记录器:
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');
【讨论】:
是的,这是正确的答案,其他的需要创建一个新的记录器,不要调整winston创建的现有默认记录器的设置。 这是最难找到的信息!谢谢@AndreasPizsa! @RudolfOlah 正确的答案是文档推荐的内容,即创建一个新的记录器。动态更改默认记录器(或任何其他已创建的记录实例)的日志级别已在 winston 的 github 问题中讨论过无数次,结果在大多数情况下 - 虽然它可能适用于大多数甚至最近/当前版本 - 到不要这样做。不要仅仅因为答案更符合您的个人喜好而称其为“正确”。然而,有一些库围绕着 winston 提供了这个功能。 感谢,谢谢。介意与此类库共享一些链接或搜索词吗? @RudolfOlah 哦,这很有趣 - 不小心提到了 RudolfOlah,而实际上我的意思是 @Num Lock。感谢你们的贡献和洞察力!【参考方案2】:您可以通过修改相应传输的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';
我猜,它对文件的工作方式类似,但我没有尝试过。
【讨论】:
【参考方案3】:winston 有 6 个默认级别:silly=0(最低)、debug=1、verbose=2、info=3、warn=4、error=5(最高)
在创建记录器传输时,您可以指定日志级别,例如:
new (winston.transports.File)( filename: 'somefile.log', level: 'warn' )
以上代码会将日志级别设置为warn
,这意味着silly
、verbose
和info
不会输出到somefile.log,而warn
、debug
和error
会。
您还可以定义自己的级别:
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 个预定义关卡,以防某处使用了预定义关卡。
【讨论】:
陈,谢谢您的回答。我已经接受了上面布莱恩的回答。但你的也很有帮助。 很抱歉,@Chen 错了。调试低于详细。建议修改。 @filsmick 你是对的。当我写这个答案时,Debug 比 verbose 高,但现在 verbose 更高。 @Chen 哦,不知道它曾经更高。看到这个我就歪了,因为没有意义,所以我测试了一下:) 一个级别是否可以只听到自己的级别?没有任何级别的价值高于它?但只有而且只有它自己的水平?【参考方案4】:如果您想即时更改日志级别。比如当您需要在短时间内跟踪生产问题时;然后恢复到错误日志级别。您可以使用动态记录器,前提是您可以在网络上公开服务https://github.com/yannvr/Winston-dynamic-loglevel
【讨论】:
【参考方案5】:看起来herehere传递的选项中有一个级别选项
来自该文档:
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 方法以在运行时更改。查看该文档的使用日志级别部分。
【讨论】:
bryanmac,感谢您的回复,但我担心它仍然无法回答我的问题。让我澄清一下。在我之前的工作中,我们使用了一个自定义日志模块,它与 winston 的功能非常相似。该模块依赖于设置日志级别的配置文件中的条目。如果我们必须调试任何问题,我们将更改配置文件中的条目以增加日志的详细程度。但在其他时候,我们会将级别设置为最低级别,以便仅记录错误。温斯顿能做到这样吗? 上面的程序代码可以从日志文件中读取来设置初始日志级别。现在,要在运行时从初始/默认级别更改,您可以公开一个 API,该 API 可以转身并调用我提到的 setLevel 方法。这样你就可以有一个管理页面来读取日志级别和设置它的方法。 布莱恩,我将接受您的初始回答 + 您的评论作为我问题的答案。谢谢。 谢谢 - 如果您对使用它的方式或效果有任何其他反馈或想法,我们将不胜感激。我现在正在经历同样的事情:) Bryan,我一定会回来在这里分享我的实现细节。以上是关于如何在 Winston/Node.js 中设置日志级别的主要内容,如果未能解决你的问题,请参考以下文章
如何在运行时在 org.jboss.logging 中设置日志记录