当前位置: 首页 > news >正文

第六步:加入日志功能

文章目录

  • 1 日志配置
  • 2 创建处理请求头信息的方法
  • 3 开启请求拦截器与异常过滤器来记录日志
    • 3.1 响应拦截器
      • 3.1.1 **在项目`src`文件夹下创建`unify-response.interceptor.ts`文件**
      • 3.1.2 **在项目`app.module.ts`文件夹下引入并使用`unify-response.interceptor.ts`文件**
    • 3.2 异常过滤器
      • 3.2.1 **在项目`src`文件夹下创建`uinify-exception.filter.ts`文件**
      • 3.1.2 **在项目`app.module.ts`文件夹下引入并使用`uinify-exception.filter.ts`文件**
  • 3 效果

  • 注:不要关心注释代码,那是属于后面功能的区域。因为随着代码体量加大,功能不再明确,只需按照步骤并参考效果图,把关键代码写入即可,所以下只写关键代码,具体请看效果图。
    项目地址

1 日志配置

// 日志 - 配置包描述
// 日志库
import * as winston from 'winston';
// 日志库的插件
import { WinstonModule } from 'nest-winston';
// 一个用于 winston 日志库的插件 // https://www.npmjs.com/package/winston-daily-rotate-file
import * as DailyRotateFile from 'winston-daily-rotate-file';mports: [
// 日志配置WinstonModule.forRoot({transports: [new DailyRotateFile({dirname: `logs`, // 日志保存的目录// dirname: `D:\\`, // 日志保存的目录 // 保存到本地filename: '%DATE%.log', // 日志名称,%DATE% 占位符表示日期。。datePattern: 'YYYY-MM-DD', // 日志轮换的频率,此处表示每天。zippedArchive: true, // 是否通过压缩的方式归档被轮换的日志文件。maxSize: '20m', // 设置日志文件的最大大小,m 表示 mb 。maxFiles: '14d', // 保留日志文件的最大天数,此处表示自动删除超过 14 天的日志文件。// 记录时添加时间戳信息format: winston.format.combine(winston.format.timestamp({format: 'YYYY-MM-DD HH:mm:ss',}),winston.format.json(),),}),],}),]

效果图

2 创建处理请求头信息的方法

  • 在项目src文件夹下创建logServer文件夹,并创建requestData.ts文件
/src/logServer/requestData.ts// 处理请求头信息的方法
import { Request } from 'express';export const getReqMainInfo: (req: Request) => {[prop: string]: any;
} = (req) => {const { query, headers, url, method, body, connection } = req;// 获取 IPconst xRealIp = headers['X-Real-IP'];const xForwardedFor = headers['X-Forwarded-For'];const { ip: cIp } = req;const { remoteAddress } = connection || {};const ip = xRealIp || xForwardedFor || cIp || remoteAddress;return {url,host: headers.host,ip,method,query,body,};
};

3 开启请求拦截器与异常过滤器来记录日志

3.1 响应拦截器

3.1.1 在项目src文件夹下创建unify-response.interceptor.ts文件

/src/unify-response.interceptor.ts// 在响应拦截器中记录日志
// https://docs.nestjs.cn/9/interceptors
import {CallHandler,ExecutionContext,Inject,Injectable,NestInterceptor,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Request } from 'express';
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
import { Logger } from 'winston';
import { getReqMainInfo } from './logServer/requestData';@Injectable()
export class UnifyResponseInterceptor implements NestInterceptor {constructor(@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,) {}intercept(context: ExecutionContext, next: CallHandler): Observable<any> {const ctx = context.switchToHttp();const req = ctx.getRequest<Request>();return next.handle().pipe(map((data) => {this.logger.info('response', {responseData: data,req: getReqMainInfo(req),});return  data}),);}
}

3.1.2 在项目app.module.ts文件夹下引入并使用unify-response.interceptor.ts文件

/src/app.module.ts//拦截器
import { APP_FILTER, APP_INTERCEPTOR } from '@nestjs/core';
// 全局响应拦截器
import { UnifyResponseInterceptor } from './unify-response.interceptor';providers: [AppService,GlobalParamsService,// 应用响应拦截器{provide: APP_INTERCEPTOR,useClass: UnifyResponseInterceptor,},],

效果图

3.2 异常过滤器

3.2.1 在项目src文件夹下创建uinify-exception.filter.ts文件

/src/uinify-exception.filter.ts// 在全局异常过滤器中记录日志
// https://docs.nestjs.cn/9/exceptionfilters?id=%e5%bc%82%e5%b8%b8%e8%bf%87%e6%bb%a4%e5%99%a8-1
import {ArgumentsHost,Catch,ExceptionFilter,HttpException,HttpStatus,Inject,
} from '@nestjs/common';
import { Response, Request } from 'express';
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
import { Logger } from 'winston';
import { getReqMainInfo } from './logServer/requestData';@Catch()
export default class UnifyExceptionFilter implements ExceptionFilter {// 注入日志服务相关依赖constructor(@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,) {}catch(exception: HttpException, host: ArgumentsHost) {const ctx = host.switchToHttp(); // 获取当前执行上下文const response  = ctx.getResponse<Response>(); // 获取响应对象const request  = ctx.getRequest<Request>(); // 获取请求对象const status =exception instanceof HttpException? exception.getStatus(): HttpStatus.INTERNAL_SERVER_ERROR;const responses = response.status(status).json({statusCode: status,timestamp: new Date().toISOString(),path: request.url,});// 记录日志(错误消息,错误码,请求信息等)this.logger.error('', {status,req: getReqMainInfo(request),stack: exception.stack,});response.status(status >= 500 ? status : 201).json(response);}
}

3.1.2 在项目app.module.ts文件夹下引入并使用uinify-exception.filter.ts文件

/src/app.module.ts//拦截器
import { APP_FILTER, APP_INTERCEPTOR } from '@nestjs/core';
// 全局异常过滤器
import UnifyExceptionFilter from './uinify-exception.filter';providers: [AppService,GlobalParamsService,// 应用全局异常过滤器{provide: APP_FILTER,  useClass: UnifyExceptionFilter,},],

效果图

3 效果

  • 此时随便调用一个接口就会在项目里看到日志
    效果图
http://www.dtcms.com/a/458654.html

相关文章:

  • 16.C++三大重要特性之多态
  • 鄂州网站建设网站建设的界面f分
  • 网站添加对联广告代码shine跨境电商平台
  • Linux VScode 安装PHP环境
  • 云速建站与传统网站的区别在线设计装修软件
  • 南安建设局网站wordpress英文模版
  • leaflow 部署openlist 部署教程
  • 成都网站空间创新互联网站建设与管理维护的答案李建青
  • photoprism开源去中心化网络的 AI 照片应用
  • 如何在记事本中做网站链接教务处网站建设方案
  • 管理系统网站模板下载上海国家企业信用网
  • 网站怎么优化关键词南京网站设计公司哪儿济南兴田德润怎么联系
  • 博白建设局网站游戏网站logo制作
  • Linux 命令:readlink
  • 三亚建设局网站网站建设上传视频教程
  • 怎样自己建设一个网站济南建设工程信息网官网
  • 买别人做的网站能盗回吗网站建设国家有补贴吗
  • 企业网站的公司和产品信息的介绍与网络营销关系wordpress使用教程书
  • 出版社网站建设方案宁波seo优化项目
  • 自建站电商外贸网站后台fpt
  • 上海医疗 网站制作建设工程人员押证在哪个网站查
  • 吴恩达机器学习课程(PyTorch 适配)学习笔记:3.1 无监督学习基础
  • 做移动类网站的书推荐2014个人网站备案
  • Trea国际版|海外版下载
  • 宝德科技专业嘉兴网站建设网站姐姐做床戏网站
  • 河池公司做网站最近在线观看免费完整版高清电影
  • 网站开发代理江苏如可建设淘宝链接网站
  • 长治网站运营百度seo学院
  • 如何在百度里建网站国内免备案
  • 中华山河诗卷:省域经纬,城乡弦歌