winston 被设计为一个简单且通用的日志库,支持多种传输。 传输本质上是日志的存储设备。 每个 winston 记录器都可以在不同级别配置多个存储渠道。例如,人们可能希望将错误日志存储在持久的远程位置(如数据库),但所有调试日志都输出到控制台或本地文件。
使用 winston 的推荐方法是创建您自己的记录器。 最简单的方法是使用 winston.createLogger:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: { service: 'user-service' },
transports: [
//
// - Write all logs with level `error` and below to `error.log`
// - Write all logs with level `info` and below to `combined.log`
//
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
],
});
//
// If we're not in production then log to the `console` with the format:
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
//
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple(),
}));
}
const levels = {
error: 0,
warn: 1,
info: 2,
http: 3,
verbose: 4,
debug: 5,
silly: 6
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
如何创建 logger
const logger = winston.createLogger({
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'combined.log' })
]
});
- 1
- 2
- 3
- 4
- 5
- 6
即使 logger 实例创建之后,也能容易地删除或者增添新的 transport:
const files = new winston.transports.File({ filename: 'combined.log' });
const console = new winston.transports.Console();
logger
.clear() // Remove all transports
.add(console) // Add console transport
.add(files) // Add file transport
.remove(console); // Remove console transport
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
也能使用 logger 的 configure 方法,重新配置新的 transport:
const logger = winston.createLogger({
level: 'info',
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'combined.log' })
]
});
//
// Replaces the previous transports with those in the
// new configuration wholesale.
//
const DailyRotateFile = require('winston-daily-rotate-file');
logger.configure({
level: 'verbose',
transports: [
new DailyRotateFile(opts)
]
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
在 winston 中,Logger 和 Transport 实例都被视为接受 info 对象的 objectMode 流。
提供给给定格式的 info 参数表示单个日志消息。 对象本身是可变的。 每个信息必须至少具有 level 和 message 属性:
const info = {
level: 'info', // Level of the logging message
message: 'Hey! Log something?' // Descriptive message being logged.
};
- 1
- 2
- 3
- 4
除了级别和消息之外的属性被视为“元属性”:
const { level, message, ...meta } = info;
- 1
我们来动手写一个实际的例子。
主程序:
// @ts-nocheck
var express = require('express');
var app = express();
var DEFAULTPORT = 3003;
var port = process.env.PORT || DEFAULTPORT;
var winstonTest = require("./winstonTest");
app.get('/', function(_req, res){
res.send("Hello world");
winstonTest.logMessage('234');
});
app.listen(port, function(){
console.log("App listens on port: " + port);
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
winstonTest 的实现:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: { service: 'user-service' },
transports: [
//
// - Write all logs with level `error` and below to `error.log`
// - Write all logs with level `info` and below to `combined.log`
//
new winston.transports.File({ filename: 'data/error.log', level: 'error' }),
new winston.transports.File({ filename: 'data/combined.log' }),
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple(),
}));
}
console.log('Logger initialized successfully!');
function log(content){
logger.info('hello', { message: content });
}
module.exports = {
logMessage: log
};
- 26
- 27
- 28
- 29
- 30
- 31
浏览器里输入如下 url:
http://localhost:3003/
在 combined.log 里生成了如下 log 文件:
这就是 winston 最基本的使用方法。