第二十二章 了解集成日志框架Winston

winston是一个用于Node.js的日志记录库。它提供了一种灵活的方式来记录应用程序中的日志,并支持多种日志传输和存储方式。

winston的主要作用包括:

  1. 记录日志:winston允许你在应用程序的不同部分记录各种类型的日志,如信息、警告、错误等。你可以使用不同的记录级别来控制日志的详细程度。
  2. 多种传输方式:winston支持多种传输方式,如控制台输出、文件存储、数据库存储等。你可以根据自己的需求选择合适的传输方式来存储日志。
  3. 自定义日志格式:winston允许你自定义日志的格式,包括时间戳、日志级别、日志内容等。你可以根据自己的需求定制输出的日志格式。
  4. 错误处理:winston提供了一些特殊的日志记录器,用于捕获和记录应用程序中的异常错误。这有助于及时发现和解决错误。

winston 日志框架 是目前Node中最流行的,可以看到 下载量超级高
连接地址:https://www.npmjs.com/package/winston
1720941037744.png
接下来我们测试一下winston的功能:
首先创建 进入文件夹 并初始化

mkdir winston-test-demo && cd winston-test-demo && npm init -y

1720942003212.png
安装 winston:

pnpm install --save winston

1720942188308.png
接着创建 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

1720943213604.png
如果我们再次运行 会发现 文件会继续生成数据
1720943384755.png
此时你可能会想到 那如果数据量很多会怎么办 会不会导致最终的文件特别大?
其实 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

1720943920088.png
除了按照文件大小自动分割日志文件,还可以按照日期自动分割文件 但是要实现此功能 需要安装按照日期滚动存储到日志文件的 Transport , 接下来我们进行安装:

pnpm install --save winston-daily-rotate-file

1720944426503.png
修改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

1720944620299.png

接下来我们创建一个nest项目;

nest new winston-log-server

1720945346238.png
新增log 接口

@Post('log')
  log(@Body() body) {
    console.log(body)
  }

1720945968957.png
运行项目:

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

1720947092605.png
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');

相关推荐

  1. React 第二 前端框架

    2024-07-22 17:22:02       23 阅读
  2. 第二 : Spring Boot 集成RabbitMQ(四)

    2024-07-22 17:22:02       57 阅读
  3. 第二 : Spring Boot 集成RabbitMQ(五)

    2024-07-22 17:22:02       40 阅读
  4. golang 集成logrus日志框架

    2024-07-22 17:22:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 17:22:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 17:22:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 17:22:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 17:22:02       55 阅读

热门阅读

  1. opengaussdb在oepnEuler上安装

    2024-07-22 17:22:02       16 阅读
  2. 求助Python字体下载!

    2024-07-22 17:22:02       13 阅读
  3. 如何在 Nginx 中配置访问日志的格式?

    2024-07-22 17:22:02       16 阅读
  4. 精简的力量:目标检测中的模型压缩技术解析

    2024-07-22 17:22:02       15 阅读
  5. 如何用外呼系统提高销售打电话效率

    2024-07-22 17:22:02       16 阅读
  6. 计算机网络之物理层

    2024-07-22 17:22:02       14 阅读
  7. 并发编程核心概念

    2024-07-22 17:22:02       15 阅读
  8. iOS中的MVVM设计模式

    2024-07-22 17:22:02       19 阅读
  9. C语言 检查日期是否有效

    2024-07-22 17:22:02       19 阅读