一、简介
winston是一个简单通用的node服务端日志记录库。它有如下特点:
支持多种存储介质,例如将日志存储在本地文件、远程数据库或者直接输出在控制台
支持日志记录分级,以区分其重要程度
灵活可扩展,日志的格式、等级、存储介质皆可自定义
二、用法
1、使用createLogger方法创建日志记录器(官方推荐使用方式)
自创建日志记录器 折叠源码
import winston from 'winston'
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
三、可配置项
参数名称默认值参数说明
levelswinston.config.npm日志记录分级标准,可自定义。
level'info'日志记录的最低级别,取值于levels,只记录严重程度大于等于'info'的日志记录
formatwinston.format.json每一条日志记录的格式,可自定义
transports[ ]指明了日志的存储位置,可扩展
exitOnErrortrue当winston发生错误时,是否退出
silentfalse设置为true,则所有日志记录被禁止,(实际访问时logger.silent为undefined)
1.levels
levels指明了日志可以分为几个级别,各级别定义了日志记录的严重程度。每个级别对应一个整数,随着整数值由小到大,记录的严重性由高到低。winston.config中内置了三个levels,默认的levels为winston.config.npm(如下),还有两个是winston.config.cli和winston.config.syslog。除了内置的levels,我们也可以自己定义levels。
winston.config.npm
{
levels:
{ error: 0,
warn: 1,
info: 2,
http: 3,
verbose: 4,
debug: 5,
silly: 6
},
colors:
{ error: 'red',
warn: 'yellow',
info: 'green',
http: 'green',
verbose: 'cyan',
debug: 'blue',
silly: 'magenta'
}
}
在使用winston.createLogger方法创建了日志记录器logger并在配置项中指定了levels之后,levels中的每个属性都将会作为记录器的方法,例如logger.error、logger.info。因此,写入记录时将有两种方式:logger.log(level,message[,meta])和logger.[levels属性](message[,meta])。
写入记录 折叠源码
//使用log方法写入日志
logger.log('info', "this is a info message")
logger.log('warn', "this is a warn message")
logger.log('error', "this is a error message")
//使用levels属性方法写入日志
logger.info("this is a info message")
logger.warn("this is a warn messagee")
logger.error("this is a error message")
2.format
在winston中,写入的每一条日志记录都是一个info 对象。info 对象是一个可变的对象,但是它必须有level和message两个属性。format就是一系列对info 对象进行格式化处理的函数。winston内置了15个默认的格式化方法。常用的有以下几个:
colorize():控制台输出时,为日志记录中的level属性和message属性添加颜色;输出到文件时,使用此方法会导致乱码。
padlevels():格式对齐
timestamp():为info对象添加timestamp属性,属性的默认值为世界时,与北京时间有8小时时差。因此使用时要设置format参数,例timestamp({format:'YYYY-MM-DD HH:mm:ss'})
metadata():用来搜集处理写入到info对象中的元数据对象。
simple():格式化输出方法,只输出包含level属性和message属性的json
json():格式化输出方法,将info对象序列化为json输出。
printf():格式化输出方法。接收一个回调函数作为参数,可自定义输出的格式。
combine():用于将多个格式化方法合并。
info object
{
level: 'info',
message: 'this is a info message!'
}
winston.format 折叠源码
import { createLogger, format, transports} from 'winston'
const { combine, metadata, timestamp, printf, colorize, padLevels } = format
const loggerDebug = createLogger({
level: 'debug',
format: combine(
colorize({all: true}),
timestamp({format: 'YYYY-MM-DD HH:mm:ss'}),
metadata({key: 'content', fillExcept: ['timestamp', 'level', 'message']}),
padLevels(),
printf(info => `${info.timestamp} ${info.message}: ${safeStringify(info.content)}`)
),
transports: [
new transports.Console()
]
})
3.transports
在winston中,transport指定了日志记录的存储位置。winston内置了四个transport:Console、File、Http、Stream。除此之外,winston的贡献者及社区人员也开发了非常多的transport。
winston.transports.Console(options)
Console的可配置项 折叠源码
new winston.transports.Console({
level: 'info', //该transport应该记录哪一level的日志,默认值与logger中设置的相同
silent: false, //是否禁止输出,默认为false
eol: os.EOL, //string类型,结束字符串,默认为os.EOL
stderrLevels:[],//levels过滤后的数组,包含了应当用stderr代替stdout来记录的level,默认为空数组
consoleWarnLevels :[] //levels过滤后的数组,包含了应当使用console.warn/stderr代替stdout的level,默认为空数组
})
winston.transports.File
(options)
File可配置项 展开源码
winston.transports.DailyRotateFile(options)
transports.DailyRotateFile 折叠源码
new transports.DailyRotateFile({
datePattern: 'YYYY-MM-DD',//日期格式
filename: 'logs/info/info-%DATE%.log',//日志记录路径
// zippedArchive: true,//除正在进行记录的日志文件外,其他文件是否压缩。设置为true后,压缩文件无法删除
maxSize: '20m',//每个文件的最大存储容量,单位可为k、m、g
maxFiles: '30d'//日志删除的条件,可为数字或数字后加d表示的天数。
})
winston.transports.Http
(options)
Http可配置项 折叠源码
new winston.transports.Http({
host: 'localhost',//存储日志的主机名(Default: localhost)
port: 80,// 端口号(Default: 80 or 443)
path: '',//日志存储的文件路径(Default: /)
auth: {} ,//(Default: None) 包含http认证时所使用的username和password的对象
ssl: false// 是否使用HTTPS,(Default: false)
})
winston.transports.Stream(
options)
Stream可配置项 折叠源码
new winston.transports.Stream({
stream: fs.createWriteStream('/dev/null'),//any Node.js stream. If an objectMode stream is provided then the entire info object will be written. Otherwise info[MESSAGE] will be written.
level: 'info', //该transport应该记录哪一level的日志,默认值与logger中设置的相同
silent: false, //是否禁止输出,默认为false
eol: '\r\n', //string类型,结束字符串,默认为os.EOL
})
四、异常处理
当winston出现异常时,我们可以通过捕捉到这类异常,并将其记录下来。
winston异常处理 折叠源码
import { createLogger, format, transports } from 'winston'
//方法一:在创建日志记录器时,设置exceptionHandlers
const logger = createLogger({
transports: [
new transports.File({ filename: 'combined.log' })
],
exceptionHandlers: [
new transports.File({ filename: 'exceptions.log' })
]
});
//方法二:创建日志记录器后,调用logger.exceptions.handle方法添加
const logger1 = createLogger({
transports: [
new transports.File({ filename: 'combined.log' })
]
});
logger1.exceptions.handle(
new transports.File({ filename: 'exceptions.log' })
);
五、日志查询
使用日志记录器的query方法可以查询日志记录,它接收两个参数:查询条件options、查询结果处理函数。其中options中的可配置项可参照loggly(https://www.loggly.com/docs/api-retrieving-data/)。
日志查询 折叠源码
const options = {
from: new Date() - (24 * 60 * 60 * 1000),
until: new Date(),
limit: 10,
start: 0,
order: 'desc',
fields: ['message']
};
logger.query(options, function (err, results) {
if (err) {
/* TODO: handle me */
throw err;
}
console.log(results);
});
网友评论