如何让Node.js正确地日志

JavaScript027

如何让Node.js正确地日志,第1张

为了完成这点,你会需要使用一个最流行的开发包,叫做 winston. Winston 是一个 Node.js 的多通道异步传输日志库。

你可以通过安装 winston 的方式,添加它到你的项目中:

一旦你安装之后,你可以这样添加 winston 到你的项目:

上面的代码片段会推送接下来的这行信息到 stdout :

如同你所看到的那样,我们传递了 info 字符串到 winston ,从而告诉 winston 这个将要日志的事件有一个日志级别与之关联,也就是 info。默认情况下, winston 附带了接下来的几种日志级别 (也可以添加自定义的级别) :

你可以通过接下来的一行设置日志的级别:

在 RisingStack ,我们通常利用一个叫 LOG_LEVEL 的环境变量来配置。这样的话,我们就可以动态改变哪些内容应该被日志记录:

当你的日志级别是 silly 时,你应该尽可能的多记录所有的日志。尽管如此,你还是需要遵守一个经验法则:绝对不要记录凭证,密码以及任何敏感的信息。

“绝对不要记录凭证,密码以及任何敏感的信息。” via @RisingStack #nodejs #logging #security

点击直达 TWEET

通常来说,会有至少一个以上的用户访问日志,所以,日志事件里面包含凭证信息会增加额外的风险。

当你 开始使用微服务 , 从日志角度来看,最大的挑战就是分布式追踪。

在一个分布式的架构中,错误检测会令人沮丧,因为由于系统的瑕疵会导致大量的警报信息涌现。分布式追踪的目的就是为了消除这个问题,它可以提供更多的事务和错误的视角,而普通的日志文件并没有能力做到这些。

为了做到这点,你不得不使用一个所谓的相关标识符——并且把它传递给所有的参与事务操作的服务。然后,如果每行日志都标注了这个 ID ,你就可以搜索这些事件了。

为了生成一个唯一的 ID ,你可以这样使用 uuid 模块:

这个 ID 不得不在函数调用中传递,并且它也不得不被发送到下游的服务。 如同你可以想象到的,这不是个特别值当的任务。

这里讲到追踪,我们的 Node.js / 微服务监控 解决方案如下图所示。追踪相关的 ID 到请求的容器,并且可视化了一个简单的树状图的数据流。你不会需要去搜索日志,因为它会直接以一种容易理解的方式去展示你的事务:

Node.js distributed tracing with trace by risingstack

根据这种方式, 你可以直接看到你的微服务和持续产生的 issue 之间的依赖关系

如果你实现了我们刚刚讨论的这些方法和工具,Node.js 的日志记录将不再是一件难事。

在react native中有这么几种日志: 在debug模式下,react native默认打印trace以上级别日志 在release模式下,react native默认打印error以上级别日志 如果想在release模式下,打印所有console日志,可以在AppDelegate.m中这么干: 1、引入RCTLog头文件 #import <React/RCTLog.h> 2、在application方法中调整日志级别 RCTSetLogThreshold(RCTLogLevelTrace) 然后在mac系统下就可以通过console.app来过滤查看日志: 有了js console日志,调试生产包就方便很多了!如果不习惯苹果的控制台,可以安装libimobiledevice 安装libimobiledevice很简单,在命令行输入: brew install libimobiledevice --HEAD 不知道brew的自己去脑补,如果电脑上没有brew,请看这里: brew安装传送门如何使用idevicesyslog 很简单,在命令行输入: idevicesyslog 就可以在屏幕上看见手机上所有的日志了。 如何查看我们想要的日志     1)将设备日志重定向到文件 idevicesyslog >> iphone.log & 该命令是将日志导入到iphone.log这个文件,并且是在后台执行。     2)用tail -f和grep查看log tail -f iphone.log tail -f iphone.log | grep 'QQ’  # 查看包含QQ的行 如图:

winston 目前最新版本3.2.1,周下载量在300万以上,github star 13k+, 可以说是一个非常流行的nodejs 日志管理库。值得每个nodejs 开发人员去熟悉和了解。

npm winston截图

github winston 截图

winston 支持RFC5424标准的日志等级,即debug/info/notice/warning/error等,每一个日志等级都实现为一个函数,你可以直接调用对应的函数,来表明你想要输出日志的重要程度。

所谓多路传输,是指,你可以自定义多个日志储存驱动,比如,将日志输出到终端的同时,将重要日志记录到文件中,甚至写到数据库中

随便一搜都有: winston -daily-rotate-file,express- winston,winston -mongodb, winston -redis, winston -mail等等等。

添加自定义传输很容易。 您需要做的就是接受您需要的任何选项,实现log()方法,并使用winston使用它。

winston支持使用类似Loggly的选项查询日志。 请参阅Loggly Search API。 具体来说:File,Couchdb,Redis,Loggly,Nssocket和Http。

除了winston中可用的预定义npm,syslog和cli级别,您还可以选择定义自己的级别

winston的格式可以从winston.format访问。 它们在logform中实现,这是winston的一个独立模块。 这样可以在编写自己的传输时提供灵活性,以防您希望在传输中包含默认格式。

winston为任何日志实现了一个简单的分析机制(Profiling)

流式处理允许您从所选传输流式处理日志。

winston,可以捕获并记录进程中的uncaughtException事件