前言
Winston是一款簡單测摔、通用且支持多種transport
方式的日志庫暑中。在Winston模塊中灶体,一個transport
方式就是對日志定義一種存儲位置或存儲設(shè)備钦讳,Logger的每個實例都可以配置多個不同級別的transport
矿瘦。例如,可以將錯誤日志存儲在可持久保存的遠(yuǎn)程位置(如數(shù)據(jù)庫)也可以將日志輸出到控制臺或保存到本地文件中愿卒。
本文主要是對Winston模塊的入門學(xué)習(xí)缚去,主要講述了Logger的使用。更多操作可以參考Winston模塊的github主頁
安裝和使用
npm install --save winston
Logger的優(yōu)先級
在npm中琼开,為Logger設(shè)定了六種優(yōu)先級易结,優(yōu)先級越高,消息也就被認(rèn)為約重要柜候,對應(yīng)的整數(shù)便越小搞动,具體為:
{error : 0,warn : 1改橘,info : 2滋尉,verbose : 3,debug : 4飞主,silly : 5 }
從上面的例子中我們可以看到狮惜,對于優(yōu)先級的使用有兩種方法
- 將表示日志優(yōu)先級的參數(shù)傳遞給log()方法
- 使用Winston Logger中自帶指定優(yōu)先級的方法
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的基本使用
使用默認(rèn)的Logger
使用Winston模塊,我們可以直接使用默認(rèn)的Logger碌识,可以調(diào)用默認(rèn)Logger的實例中的任何一個函數(shù)碾篡。例子如下:
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!
在默認(rèn)情況下,所有的transport
都是顯示在console中的筏餐,我們可以使用add()和remove()方法來添加或者刪除transport
开泽。
//添加一個`transport`,保存位置為somefile.log文件
winston.add(winston.transports.File, { filename: 'somefile.log' });
//刪除一個`transport`魁瞪,不在console中顯示
winston.remove(winston.transports.Console);
也可以使用configure()函數(shù)來創(chuàng)建一個新的transport
。
winston.configure({
transports: [
new (winston.transports.File)({ filename: 'somefile.log' })
]
});
使用自定義的Logger
加入我們想更好地管理Logger,那么可以使用自定義的Logger嗽冒,例子如下:
//創(chuàng)建一個新的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`方式
和默認(rèn)的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
方式,然后設(shè)定不同的嚴(yán)重級別洛口,根據(jù)級別的不同設(shè)定不同的處理方式矫付,例如:對于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'
})
]
});
對于設(shè)定好的Logger买优,我們可以根據(jù)不同transport
的name
參數(shù),對其進行刪除:
logger.remove('info-file');//刪除name為info-file的`transport`
也可以根據(jù)不同transport
在Logger中的聲明順序進行刪除樟遣,代碼如下:
//刪除第一個`transport`
var infoFile = logger.transports[0];
logger.remove(infoFile);
Logger之間共享transport
對于Logger之前共享transport
而叼,可以通過三種方法進行實現(xiàn):
- 將
transport
在默認(rèn)的container
中設(shè)定 - 將
transport
加入到winston.container
的構(gòu)造函數(shù)中 - 將
transport
加入.get()
和.add()
方法
var winston = require('winston');
// 1.將`transport`設(shè)置在默認(rèn)的container中
winston.loggers.options.transports = [
// Setup your shared transports here
];
// 2.將`transport`加入到`winston.container`的構(gòu)造函數(shù)中
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
當(dāng)項目的規(guī)模到達一定程度的時候,如果想系統(tǒng)的管理代碼豹悬,則Winston日志模塊便會十分有用葵陵。我們可以在一個文件中專門定義各種Logger和transport
,然后將其作為一個模塊進行導(dǎo)出瞻佛。在需要使用的文件中脱篙,則將其引用,根據(jù)需求進行調(diào)用伤柄。例子:
//在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')