打造清晰的日志管理策略:如何在 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版》&…

Python中的cls语法

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

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

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

论文笔记 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 …

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

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

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

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

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…

外包干了1个月,技术退步一大半。。。

先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

c语言版:数据结构(时间复杂度,空间复杂度,练习)

时间复杂度 概念 时间复杂度是用来衡量算法执行时间的一个指标。它表示随着输入规模的增加,算法执行时间的增长率。时间复杂度通常用大O符号表示。 在计算时间复杂度时,通常会忽略常数项、低阶项和系数项,只关注随着输入规模增长而导致的主要…

网络名称解读 -入门5

WAN: Wide Area Network(跨区域),LAN: Local Area NetworkWAN MAC, 用来连接上级网络, LAN MAC, 用于内部网路。 LAN & WAN 3.1,LAN表示子网,通过掩码来筛选子网内主机数量&…

【C++】类和对象详解(类的使用,this指针)

文章目录 前言面向过程和面向对象的初步认识类的引入类的定义类的访问限定符和封装性访问限定符封装性 类的作用域类的实例化类对象模型如何计算类对象的大小类对象的存储方式猜测结构体内存对齐规则 this指针this指针的引出this指针的特性 总结 前言 提示:这里可以…

计算机毕业设计选题分享-SSM律师事务所业务管理系统01664(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

SSM律师事务所业务管理系统 摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,律师事务所业务管理系统当然也不能排除在外。律师事务所业务管理系统是以实际运用为开发背景…

静态网页设计——电影推荐网(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1NK411x7oK/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术:HTMLCSSJS(…

【亚马逊云科技】使用Helm 3为Amazon EKS部署Prometheus+Grafana监控平台

文章目录 1. 创建Kubernetes命名空间2. 添加Prometheus社区helm chart3. 安装prometheus4. 检查Prometheus Pod运行状况5. 检查Prometheus Service部署情况6. 修改服务访问端口类型7. 访问Prometheus数据收集情况8. 访问Grafana9. 设置数据源10. 查看Kubernetes各类性能可视化参…

c/c++运算符优先级【一文搞懂】【大白讲解】

C运算符优先级教程 我们知道,在数学运算中,有 “先乘除后加减” 的运算规则,在我们程序语言中一样有运算符的优先级问题,来决定我们运算的顺序问题,这就是运算符的优先级。 即所谓运算符的优先级,指的是在…

【linux笔记】top、ps

【linux笔记】top命令 top(Table of process)是动态变化的。而ps是静态的。 PID — 进程id USER — 进程所有者 PR — 进程优先级 NI — nice值。负值表示高优先级,正值表示低优先级 VIRT — 进程使用的虚拟内存总量,单位kb。VI…

C语言实例_string.h库函数功能及其用法详解

一、前言 在计算机编程中,字符串处理是一项常见而重要的任务。C语言的string.h头文件提供了一系列函数和工具,用于对字符串进行操作和处理。这些函数包括字符串复制、连接、比较、查找等功能,为开发人员提供了强大的字符串处理能力。本文将对…