前言
Winston是一款简单、通用且支持多种transport
方式的日志库。在Winston模块中,一个transport
方式就是对日志定义一种存储位置或存储设备,Logger的每个实例都可以配置多个不同级别的transport
。例如,可以将错误日志存储在可持久保存的远程位置(如数据库)也可以将日志输出到控制台或保存到本地文件中。
本文主要是对Winston模块的入门学习,主要讲述了Logger的使用。更多操作可以参考Winston模块的github主页
安装和使用
npm install --save winston
Logger的优先级
在npm中,为Logger设定了六种优先级,优先级越高,消息也就被认为约重要,对应的整数便越小,具体为:
{error : 0,warn : 1,info : 2,verbose : 3,debug : 4,silly : 5 }
从上面的例子中我们可以看到,对于优先级的使用有两种方法
- 将表示日志优先级的参数传递给log()方法
- 使用Winston Logger中自带指定优先级的方法
logger.log('silly', "127.0.0.1 - there's no place like home");
logger.log('debug', "127.0.0.1 - there's no place like home");
logger.log('verbose', "127.0.0.1 - there's no place like home");
logger.log('info', "127.0.0.1 - there's no place like home");
logger.log('warn', "127.0.0.1 - there's no place like home");
logger.log('error', "127.0.0.1 - there's no place like home");
logger.info("127.0.0.1 - there's no place like home");
logger.warn("127.0.0.1 - there's no place like home");
logger.error("127.0.0.1 - there's no place like home");
Logger的基本使用
使用默认的Logger
使用Winston模块,我们可以直接使用默认的Logger,可以调用默认Logger的实例中的任何一个函数。例子如下:
var winston = require('winston');//声明Winston模块
winston.log('info', 'Hello distributed log files!');
//在console输出:info: Hello distributed log files!
winston.info('Hello again distributed logs');
//在console输出:info: Hello again distributed logs
winston.level = 'debug';//定义Logger的级别为debug
winston.log('debug', 'Now my debug messages are written to console!');
//在console输出:debug: Now my debug messages are written to console!
在默认情况下,所有的transport
都是显示在console中的,我们可以使用add()和remove()方法来添加或者删除transport
。
//添加一个`transport`,保存位置为somefile.log文件
winston.add(winston.transports.File, { filename: 'somefile.log' });
//删除一个`transport`,不在console中显示
winston.remove(winston.transports.Console);
也可以使用configure()函数来创建一个新的transport
。
winston.configure({
transports: [
new (winston.transports.File)({ filename: 'somefile.log' })
]
});
使用自定义的Logger
加入我们想更好地管理Logger,那么可以使用自定义的Logger,例子如下:
//创建一个新的Logger,定义两种`transport`方式
//一个`transport`为显示在console
//一个`transport`为保存到本地文件
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'somefile.log' })
]
});
在完成了对Logger的定义之后,便可以在文件中对其进行使用:
//使用自定义的Logger
//将信息显示在console,同时保存到本地文件
logger.log('info', 'Hello distributed log files!');
logger.info('Hello again distributed logs');
对于自定义的Logger,同样可以对transport
方式进行添加和删除:
logger
.add(winston.transports.File)//添加`transport`方式
.remove(winston.transports.Console);//删除`transport`方式
和默认的Logger类似,我们也可以使用configure
方法来批量定义winston.Logger
的实例:
var logger = new winston.Logger({
level: 'info',
transports: [
new(winston.transports.Console)(),
new(winston.transports.File)({
filename: 'somefile.log'
})
]
});
//批量定义`transport`类型
logger.configure({
level: 'verbose',
transports: [
new(require('winston-daily-rotate-file'))(opts)
]
});
相同类型的多个transport
对于自定义的Logger,我们可以对其定义多个相同类型的的transport
方式,然后设定不同的严重级别,根据级别的不同设定不同的处理方式,例如:对于info类型就在console中显示,对于error类型就保存在本地文件中。
var logger = new (winston.Logger)({
transports: [
//info级别的保存在filelog-info.log文件中
new (winston.transports.File)({
name: 'info-file',
filename: 'filelog-info.log',
level: 'info'
}),
//error级别的保存在filelog-error.log文件中
new (winston.transports.File)({
name: 'error-file',
filename: 'filelog-error.log',
level: 'error'
})
]
});
对于设定好的Logger,我们可以根据不同transport
的name
参数,对其进行删除:
logger.remove('info-file');//删除name为info-file的`transport`
也可以根据不同transport
在Logger中的声明顺序进行删除,代码如下:
//删除第一个`transport`
var infoFile = logger.transports[0];
logger.remove(infoFile);
Logger之间共享transport
对于Logger之前共享transport
,可以通过三种方法进行实现:
- 将
transport
在默认的container
中设定 - 将
transport
加入到winston.container
的构造函数中 - 将
transport
加入.get()
和.add()
方法
var winston = require('winston');
// 1.将`transport`设置在默认的container中
winston.loggers.options.transports = [
// Setup your shared transports here
];
// 2.将`transport`加入到`winston.container`的构造函数中
var container = new winston.Container({
transports: [
// Setup your shared transports here
]
});
// 3. 将`transport`加入`.get()`和`.add()`方法
winston.loggers.add('some-category', {
transports: [
// Setup your shared transports here
]
});
container.add('some-category', {
transports: [
// Setup your shared transports here
]
});
跨文件使用Logger
当项目的规模到达一定程度的时候,如果想系统的管理代码,则Winston日志模块便会十分有用。我们可以在一个文件中专门定义各种Logger和transport
,然后将其作为一个模块进行导出。在需要使用的文件中,则将其引用,根据需求进行调用。例子:
//在winston.js文件中定义Logger
exports.logger = new(winston.Logger)({
transports: [
new winston.transports.File({
name: 'error',
colorize: true,
timestamp: true,
level: 'error',
filename: 'project.log',
json: true
}),
new winston.transports.File({
name: 'info',
colorize: true,
timestamp: true,
level: 'info',
filename: 'project.log',
json: true
})
]
})
//在useWinston.js文件中使用Logger
var winston = require('./winston')
winston.logger.log('error', 'some error')
winston.logger.log('info', 'some info')