


这篇文章主要讲解一下日志处理工具库winston的用法,在开发一个node服务的时候我们肯定需要处理很多日志,winston提供了很多的API供我们使用!
创建logger对象:

demo1
直接使用createLogger方法就可以创建一个logger,此方法可以传入一些参数,如下:
level //能打印的日志级别
levels //自定义日志级别
format //格式化的方式
transports //处理日志的方法
exitOnError //日志处理中抛出异常是否及时退出
winston默认的日志有如下这6种:
error: 0,
warn: 1,
info: 2,
verbose: 3,
debug: 4,
silly: 5
每一种都对应一个数字,数字越小级别越高!
createLogger方法的level默认值是info,transport能处理的日志级别必须小于或等于level的值(数字)。

demo2
demo2中,error对应的日志可以处理,debug的日志不会被处理,所以如果把createLogger参数level的值设置为error,那么只有error日志可以被处理!
另外,还可以利用createLogger的levels参数自定义日志的级别,如下:

demo3
demo3中自定义了a/b/c/d四个级别的日志,默认级别是c,此时b级日志可以输出,d级日志无法输出。
winston日志的格式是createLogger中format参数定义的,默认的格式化方法是winston.format.json,就是把传入的日志信息序列化,如下:

demo4
winston提供了很多的API,让使用者可以更轻松的自定义格式化方案。

demo5
自定义日志样式的API是format(就是logform这个包),它提供了两个重要的方法combine和printf。
combine可以传入任意多个参数, 格式:combine(format1(opts), format2(opts), format3(opts), .......), format1(opts)的结果会传入format2(opts),format2(opts)的结果会传给format3(opts),以此类推依次传下去。format1、format2、format3都是由format方法构造出的函数,format接受一个函数作为参数,这个函数有两个参数info和opt,info是上一个format处理后的结果,opt是调用format时传入的参数(参考demo5)。
format还提供了插值的能力,使用方式如下:

demo6
需要使用splat和simple两个方法,插值对应的value需要放在splat数组中并且需要一一对应,如demo6所示!
如果想中断后面的format的处理,直接返回false就可以了,如下:

demo7
demo7中testFormat返回了false,myFormat就不会再被执行!
在控制台打印日志:new winston.transports.Console
将日志输出到文件中:new winston.transports.File({filename: '日志名称'})
分割日志可以使用winston-daily-rotate-file这个包,这个包主要使用file-stream-rotator这个包进行文件处理,如下:

demo8
这里要注意的是frequency(分割频率)的值只能是daily、test、custom或者以m和h结尾的字符串,否则无法分割!
也可以自定义transport,如下:

demo9
只需要继承Transport(const Transport = require('winston-transport');),并且实现log方法就可以了。
如果在transport处理中发生了异常,日志处理会被打断,如果不想被打断,可以做如下处理:

demo10
异常就会被捕获,并且存到另外一个日志文件中!
这篇文章主要是聊一聊如何使用winston来处理日志,另外egg-logger也是非常棒的日志处理的工具。
喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!(如果你看到这里就关注一下吧,你的关注是我最大的动力!)