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

前言

在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.mzph.cn/news/602106.shtml

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

相关文章

面试官:说说接口和抽象类有什么区别

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

高密集型数据服务--第2章 数据模型与查询语言

一、引言 数据模型可能是开发软件最重要的部分,而且还对如何思考待解决的问题都有深远的影响。 大多数应用程序是通过一层一层叠加数据模型来构建的。每一层都面临的关键问题是:如何将其用下一层来表示? 1.作为一名应用程序开发人员,观测现实…

Python中的cls语法

在Python中,cls 是一个用于指代类本身的约定性名称,通常用作类方法(class method)中的第一个参数。cls 类似于 self,它是对类的引用,而不是对实例的引用。cls 通常在类方法中用于访问类级别的属性和方法。举…

kafka处理大量消息积压tips —— 筑梦之路

一、consumer导致kafka积压了大量消息 场景: 1. 如果是Kafka消费能力不足,则可以考虑增加 topic 的 partition 的个数, 同时提升消费者组的消费者数量,消费数 分区数 (二者缺一不可) 2. 若是下游数据处理…

cookie和session的区别

cookie和session主要有以下区别: 1. 存放的位置: cookie: 浏览器端 session: 服务器端 2. 安全性: cookie是以明文的方式存放在客户端的,安全性相对较低 session存放于服务器中,所以安全性相对较好 3. 网络传输量…

LeetCode 28 找出字符串中第一个匹配项的下标

题目描述 找出字符串中第一个匹配项的下标 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1&…

LLM Agent之数据分析领域的应用

数据分析:Data-Copilot paper: Data-Copilot: Bridging Billions of Data and Humans with Autonomous Workflow github: https://github.com/zwq2018/Data-Copilot 先介绍下浙大提出的已扩展的数据分析框架,支持多种金融数据类型的查询,数…

Vue3-40-路由- 动态路由

说明 本文主要介绍了 对路由的动态配置,主要包括以下几个部分:1、判断某个路由是否存在;2、查看路由对象中的所有路由配置;3、添加一个路由;4、删除一个路由。针对上述四个方面,vue-router 中提供了对应的…

论文笔记 Understanding Electricity-Theft Behavior via Multi-Source Data

WWW 2020 oral 1 INTRO 1.1 背景 1.1.1 窃电 窃电(electricity theft)指用户为了逃避电费而进行非法操作的一种行为 常用的反窃电方法可分为两类: 基于硬件驱动的反窃电方法 ​​​​​​​电表开盖检测、集中器检测。。。。 硬件驱动的…

MySQL之视图案例

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

图像分割-Grabcut法(C#)

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 本文的VB版本请访问:图像分割-Grabcut法-CSDN博客 GrabCut是一种基于图像分割的技术,它可以用于将图像中的…

Linux第15步_安装FTP客户端

安装完FTP服务器后,还需要安装FTP客户端,才可以实现Ubuntu系统和Windows系统进行文件互传。 1、在STM32MP157开发板A盘基础资料\03软件中,找到“FileZilla_3.51.0_win64-setup.exe”,双击它,就可以安装。 2、点击“I …

第5章-第8节-Java面向对象中的内部类

1、内部类:属于类的成员之一,类的内部又定义类,外层的class称为外部类,内部的class称为内部类。 设计了某个类,根据需求发现其内部又需要定义一个独立的内部结构,此时就考虑将其定义为内部类,内…

docker 相关常用命令---持续更新

注意,如果命令从文档复制过来在执行总是失败,然后又确定自己的命令没有错,那就自己手工敲命令,有的命令内容复制就是不行,手工敲就没问题了。 #查看容器站点运行日志 --tail500 查看500行, 后面的是容器…

uView Skeleton 骨架屏

骨架屏一般用于页面在请求远程数据尚未完成时,页面用灰色块预显示本来的页面结构,给用户更好的体验。 说明 由于VUE和NVUE的特性不同,组件动画在VUE上为由左到右形式,在NVUE上为明暗显隐的形式。 #平台差异说明 App&#xff0…

Fontfabric:一款字体与设计的完美结合

一、产品介绍 Fontfabric是一款由国际字体设计公司Fontfabric开发的字体设计软件。它提供了一整套完整的字体设计工具,让用户可以轻松地创建、设计和定制自己的字体。Fontfabric拥有丰富的字体库,包括各种风格和类型,能够满足用户在不同场景…

2023年山东省职业院校技能大赛高职组“软件测试”赛项-接口测试报告答案(含术语)

任务五 接口测试 目录 接口测试任务要求 接口测试报告 目的 术语定义 <

安全加密基础—基本概念、keytool、openssl

安全加密基础—基本概念、keytool、openssl 目录 前言 一、概念 明文通信 无密钥密文通信 对称加密 非对称加密 数字签名 消息摘要(MD5) CA数字证书(解决公钥分发的问题) HTTPS 相关文件扩展名 常用后缀名 普通的pem文件内容 二、keytool 2.1常用的命令如下 2…

用mysql进行简单的分析查询

在MySQL中进行简单的分析查询通常涉及使用一些聚合函数和条件筛选来获取有关数据集的汇总信息。以下是一些常见的分析查询示例&#xff1a; 计算平均值&#xff1a; SELECT AVG(column_name) AS average_value FROM table_name;计算总和&#xff1a; SELECT SUM(column_name) A…

docker 完成MySQL的主从复制

文章目录 搭建步骤 搭建步骤 拉取镜像 docker pull mysql:5.7运行主从 docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_P…