winston是一个用于Node.js的日志记录库。它提供了一种灵活的方式来记录应用程序中的日志,并支持多种日志传输和存储方式。
winston的主要作用包括:
- 记录日志:winston允许你在应用程序的不同部分记录各种类型的日志,如信息、警告、错误等。你可以使用不同的记录级别来控制日志的详细程度。
- 多种传输方式:winston支持多种传输方式,如控制台输出、文件存储、数据库存储等。你可以根据自己的需求选择合适的传输方式来存储日志。
- 自定义日志格式:winston允许你自定义日志的格式,包括时间戳、日志级别、日志内容等。你可以根据自己的需求定制输出的日志格式。
- 错误处理:winston提供了一些特殊的日志记录器,用于捕获和记录应用程序中的异常错误。这有助于及时发现和解决错误。
winston 日志框架 是目前Node中最流行的,可以看到 下载量超级高
连接地址:https://www.npmjs.com/package/winston
接下来我们测试一下winston的功能:
首先创建 进入文件夹 并初始化
mkdir winston-test-demo && cd winston-test-demo && npm init -y
安装 winston:
pnpm install --save winston
接着创建 index.js 并使用winston, 用winston 中的createLogger 创建 logger 实例
level:打印的日志级别
format:日志格式
transports:日志的传输方式
在 package.json 里指定 type 为 module
{
"name": "winston-test-demo",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"type": "module",
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"winston": "^3.13.1"
}
}
接着启动项目 可以看到 控制台和文件中都有日志打印出来
node index.js
如果我们再次运行 会发现 文件会继续生成数据
此时你可能会想到 那如果数据量很多会怎么办 会不会导致最终的文件特别大?
其实 winston 可以自动按照/预设的大小分割文件
import winston from 'winston';
const logger = winston.createLogger({
level: 'debug',
format: winston.format.simple(),
transports: [
new winston.transports.Console(),
new winston.transports.File({
dirname: 'log', filename: 'test.log', maxsize: 1024
}),
]
});
logger.info('测试 info');
logger.error('测试 error');
logger.debug('测试 debug');
此处我们指定了超出1024 字节(1kb)的时候 就会被分割文件
接下来我们多运行几次项目 可以看到出现了第2个文件
node index.js
除了按照文件大小自动分割日志文件,还可以按照日期自动分割文件 但是要实现此功能 需要安装按照日期滚动存储到日志文件的 Transport , 接下来我们进行安装:
pnpm install --save winston-daily-rotate-file
修改index.js
import winston from 'winston';
import 'winston-daily-rotate-file';
const logger = winston.createLogger({
level: 'debug',
format: winston.format.simple(),
transports: [
new winston.transports.Console(),
new winston.transports.DailyRotateFile({
level: 'info',
dirname: 'log',
filename: 'test-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH-mm',
maxSize: 1024
})
]
});
logger.info('测试 info');
logger.error('测试 error');
logger.debug('测试 debug');
运行 项目 可以看到不同分钟3/打印的日志会写到不同的文件中 并且使用了 DailyRotateFile 的 transport指定了文件名和日期格式
node index.js
接下来我们创建一个nest项目;
nest new winston-log-server
新增log 接口
@Post('log')
log(@Body() body) {
console.log(body)
}
运行项目:
npm run start:dev
接着修改index.js 使用 http 的 transport 来传输日志
import winston from 'winston';
import 'winston-daily-rotate-file';
const logger = winston.createLogger({
level: 'debug',
format: winston.format.simple(),
transports: [
new winston.transports.Console(),
new winston.transports.DailyRotateFile({
level: 'info',
dirname: 'log',
filename: 'test-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH-mm',
maxSize: 1024
}),
new winston.transports.Http({
host: 'localhost',
port: '3000',
path: '/log'
})
]
});
logger.info('测试 info');
logger.error('测试 error');
logger.debug('测试 debug');
运行 winston-test-demo 项目 可以看到nest 服务收到了传过来的日志。
node ./index.js
winston中 内置的和社区的 transport 就足够用了,不管是想把日志发送到别的服务,还是把日志存到数据库等,都可以用不同 Transport 实现。可以通过 add、remove 方法 来操作transport
import winston from 'winston';
import 'winston-daily-rotate-file';
const console = new winston.transports.Console();
const file = new winston.transports.File({ filename: 'test.log' });
const logger = winston.createLogger({
level: 'debug',
format: winston.format.simple()
});
logger.clear();
logger.add(console);
logger.remove(console);
logger.add(file);
logger.info('测试 info');
logger.error('测试 error');
logger.debug('测试 debug');