打造清晰的日志管理策略:如何在 NestJS 中集成 winston 高级日志系统

news2025/1/12 6:06:46

前言

在Web应用程序的开发过程中,日志管理是不可或缺的一部分。日志可以帮助我们了解应用程序的运行状态,监控系统行为,以及在出现问题时快速定位和解决问题。

对于使用NestJS框架的项目来说,集成一个高效、可扩展的日志系统尤为重要。在本教程中,我们将探讨如何在NestJS项目中集成日志系统,并管理系统日志。

NestJS 日志原理

NestJS框架内部已经集成了简单的日志功能,你可以通过框架提供的 Logger服务来记录日志。默认情况下,Logger将日志输出到控制台,但我们可以通过扩展 LoggerService来定制日志的存储方式。

日志库集成步骤

虽然NestJS自带了简单的日志记录功能,但为了实现更高级的日志管理,我们建议使用一些成熟的日志库,如 winstonpino

一、安装日志库

npm install winston

二、创建自定义Logger服务

为了将选择的日志库(如 winston)整合到NestJS中,你需要创建一个自定义的 LoggerService。你可以在这个服务中定义日志的各种级别,比如 debug, info, warnerror

import { Injectable, LoggerService } from '@nestjs/common';
import * as winston from 'winston';

@Injectable()
export class CustomLogger implements LoggerService {
  private logger: winston.Logger;

  constructor() {
    this.logger = winston.createLogger({
      transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: 'combined.log' }),
      ],
    });
  }

  log(message: string) {
    this.logger.info(message);
  }

  error(message: string, trace: string) {
    this.logger.error(message, { trace });
  }

  warn(message: string) {
    this.logger.warn(message);
  }

  debug(message: string) {
    this.logger.debug(message);
  }

  verbose(message: string) {
    this.logger.verbose(message);
  }
}

三、注册Logger服务

在你的应用模块中注册这个自定义的 LoggerService

import { Module } from '@nestjs/common';
import { CustomLogger } from './my-logger.service';

@Module({
  providers: [MyLogger],
})
export class AppModule {}

四、使用Logger服务记录日志

一旦注册了自定义 LoggerService,你可以将该服务注入任何其他NestJS服务或控制器中,并使用它来记录日志信息。

import { Injectable } from '@nestjs/common';
import { MyLogger } from './my-logger.service';

@Injectable()
export class AppService {
  @Inject(CustomLogger)
  private logger: CustomLogger;

  public doSomething(): void {
   this.logger.log('Doing something...');
    // 其它逻辑
    try {
      // 尝试可能引发错误的操作
      this.logger.warn('Warning something...');
      throw new Error('Error');
    } catch (error) {
      this.logger.error('An error occurred', error.trace);
    }
  }
}

透过这种方式,你不仅能够更系统性地管理日志输出,还能对日志输出的存储与格式进行自由定制。

Untitled.png

高级设置:日志文件管理

随着应用程序的使用和时间的积累,日志文件可能会变得非常大。这不仅会占用大量磁盘空间,还可能使得查找特定日志变得困难。为了更好地管理日志,我们可以使用日志旋转(log rotation) 的策略。

日志旋转是指自动地备份当前日志文件并创建一个新的日志文件继续记录的过程。这通常是通过命名包含日期的策略来实现的,或者当日志文件到达特定大小时。

让我们通过一个例子来了解一下如何在NestJS应用程序中实现日志旋转。

首先,你需要安装一个可以实现日志旋转的库,像 winston-daily-rotate-file

npm install winston-daily-rotate-file

接下来,更新你的自定义Logger服务来使用这个新的transport。

import { Injectable } from '@nestjs/common';
import * as winston from 'winston';
import * as WinstonDailyRotateFile from 'winston-daily-rotate-file';

@Injectable()
export class MyLogger {
    private logger: winston.Logger;

    constructor() {
    const rotateTransport = new WinstonDailyRotateFile({
      filename: 'application-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d',
    });

    this.logger = winston.createLogger({
      transports: [rotateTransport, new winston.transports.Console()],
    });
  }

    // ... 其他日志方法 ...
}

使用 winston-daily-rotate-file,你可以自定义几个有用的选项,比如:

  • filename: 日志文件的名称格式。
  • datePattern: 日期的格式化样式,这决定了文件名中日期的显示方式。
  • zippedArchive: 是否压缩(归档)旧的日志文件。
  • maxSize: 单个文件的最大大小,会根据这个大小自动分割日志。
  • maxFiles: 保存日志文件的最长时间或文件数量的上限。

这样配置后,你的日志管理将变得更加高效,避免了手动处理大量积累的日志文件,同时确保了日志数据的完整性和可搜索性。

运行结果

项目根路径自动生成了 winston-daily-rotate-file 的配置文件

Untitled.png

日志文件内容

Untitled.png

总结

集成一个强大的日志系统到你的NestJS应用程序中是保证应用稳定性和容错能力的关键步骤。自定义日志服务和利用成熟的库(如 winston),结合日志旋转技术,可提供一个灵活且可靠的日志管理系统。实践这些步骤不仅能提升应用程序的质量,还能在排查问题时节省你宝贵的时间。记住,好的日志策略是成功项目不可或缺的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1361689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java:IO流详解

文章目录 基础流1、IO概述1.1 什么是IO1.2 IO的分类1.3 顶级父类们 2、字节流2.1 一切皆为字节2.2 字节输出流 OutputStream2.3 FileOutputStream类2.3.1 构造方法2.3.2 写出字节数据2.3.3 数据追加续写2.3.4 写出换行 2.4 字节输入流 InputStream2.5 FileInputStream类2.5.1 构…

RFM会员价值度模型

模型基本原理 会员价值度用来评估用户的价值情况,是区分会员价值的重要模型和参考依据,也是衡量不同营销效果的关键指标。 价值度模型一般基于交易行为产生,衡量的是有实体转化价值的行为。常用的价值度模型是RFM RFM模型是根据会员 最近…

C#,简单选择排序算法(Simple Select Sort)的源代码与数据可视化

排序算法是编程的基础。 常见的四种排序算法是:简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显,一般使用递归方式实现,但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。本文搜集发布四种算法…

8 单链表---带表头节点

上节课所学的顺序表的缺点 顺序表的最大问题:插入和删除时需要移动大量元素 链式存储的定义 链式存储的逻辑结构 链表中的基本概念: 注意:表头节点并不属于数据元素 单链表图示: 把3个需要的结构体定义出来: typdef …

《网络是怎样连接的》2.3节图表(自用)

图4.1:TCP拆分数据与ACK号 图4.2:实际工作中ACK号与序号的交互过程 首先,客户端在连接时需要计算出与从客户端到服务器方向通信相关的序号初始值,并将这个值发送给服务器(①)。 接下来,服务器会…

MySQL学习笔记2: MySQL的前置知识

目录 1. MySQL是什么?2. 什么是客户端,什么是服务器?3. 服务器的特点4. 安装mysql5. mysql 客户端6. mysql 服务器7. mysql的本体8. MySQL 使用什么来存储数据?9. 数据库的多种含义10. MySQL 存储数据的组织方式 1. MySQL是什么? MySQL 是…

新手养布偶猫如何选择猫主食冻干?K9、sc、希喂三个品牌推荐!

布偶猫是食肉动物,但由于肠胃脆弱敏感,所以在饮食上需要特别关注哦!为了给它们最好的呵护,现在有了主食冻干这种优质猫主食!它不仅符合猫咪的天然饮食习惯,还用了新鲜生肉做原料呢!营养满分不说…

如何设计企业级业务流程?学习华为的流程六级分类经验

业务流程管理(BPM)是一种系统化的方法,用于分析、设计、执行、监控和优化组织的业务流程,以实现预期的目标和价值。业务流程管理中,流程的分级方法有多种,常见的有以下几种: APQC的流程分级方法…

Agilent安捷伦E4407B频谱分析仪26.5GHz

E4407B是安捷伦ESA-E系列频谱分析仪,它是一款能够适应未来需要的中性能频谱分析仪解决方案。该系列在测量速度、动态范围、精度和功率分辨能力上,都为类似价位的产品建立了性能标准。其灵活的平台设计使得研发、制造和现场服务工程师能够自定义产品&…

(Python + Selenium4)Web自动化测试自学Day2之动手尝试

目录 文章声明⭐⭐⭐让我们开始今天的学习吧!小试牛刀关于select标签关于弹窗只有一个点击按钮的弹窗需要确认的弹窗用户可以输入的弹窗 文章声明⭐⭐⭐ 该文章为我(有编程语言基础,非编程小白)的 Python Selenium4 Web自动化测试…

在 docker 容器中配置双网卡,解决通讯的问题

目录 1. 查看当前网络信息 2. 创建自定义网络桥 3. 创建双网卡模式 4. 删除默认网卡 已经创建好了的 Docker 容器,要修改它的IP比较麻烦,网上找了几种不同的方法,经过试验都没有成功,下面通过配置双网上来解决 IP 的问题。…

无心剑七绝《译无止境》

七绝译无止境 人生跌宕几春秋 苦辣酸甜永不休 只待通灵成妙译 神思曼舞醉琼楼 2024年1月6日 平水韵十一尤平韵 无心剑的这首《译无止境》以七言绝句的形式,表达了对翻译事业的热爱和追求。 首句“人生跌宕几春秋”,意味着人生的曲折变化&#xff0c…

IP代理测试:Ping测试如何做?

您在访问互联网时是否遇到过持续滞后或花费很长时间等待网站加载的情况?为了避免这种情况,您可以测试 ping 以查看连接速度。如果您使用代理,此 ping 测试还会显示代理服务器的响应速度。 ping 测试是一个很有价值的工具,可以帮助…

修改mariadb的默认存储路径

首先mariadb服务正常启动 安装mariadb: https://blog.csdn.net/qq_50247813/article/details/135402502?spm1001.2014.3001.5502 停止mariadb服务 systemctl stop mariadb创建新的数据存放目录 mkdir /data将mariadb的数据拷贝到/data目录下 mv /var/lib/mysq…

Python+Appium自动化测试的使用步骤

这篇文章主要介绍了PythonAppium实现自动化测试的使用步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一、环境准备 1.脚本语言:Python3.x IDE&…

GLTF编辑器设置3D纺织纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 位移贴图是一种纹理映射技术,通过改变顶点的位置来模拟细…

I.MX6ULL开发笔记(三)——挂载NFS网络文件系统

0x01 网络文件系统 当我们在编译一个文件时,正常是在一个pc上编译好一个文件,之后丢到开发板上去运行。如果有了NFS网络文件系统,那么我们就可以在PC以及开发板上共享文件了。 网络文件系统,常被称为NFS(Network Fil…

计算机基础知识——校验码概述

目录 1 码距 2 奇偶校验 3 CRC循环冗余校验码 3.1 多项式 3.2 编码的组成 3.3 生成多项式 3.4 校验码的生成 4 海明校验码和恒比码 4.1 校验方程 4.2 恒比码 1 码距 码距是恒量一种编码方式的抗错误能力的一个指标。数字信息在传输和存取的过程中,由于…

k8s的陈述式管理

k8s的陈述式管理: 所谓的陈述式管离也就是命令行工具 优点:90%以上都可以满足 对资源的增删查比较方便,对改不是很友好 缺点:命令比较冗长,复杂,难记 声明式: k8s当中的YAML文件来实现资源管…

MySQL之视图案例

目录 一.视图1.1 含义1.2 操作 二.案例三.思维导图 一.视图 1.1 含义 虚拟表,和普通表一样使用 1.2 操作 1.创建视图 create view 视图名 as 查询语句; 2.视图的修改 方式一: create or replace view 视图名 as 查询语句 方式二&#x…