NESTJS 中的日志系统winston
背景:
需在现有TS项目中新增log系统, 用于记录请求以及相应信息,因为对ts的学习不是很深入,所以记录过程以供复盘.
log模块选型:
社区的主流日志实现有:
log4js, Winston, pino
简单压测结果为 log4js>winston>pino>bunyan
综合网络教程及star数, 选择 log4js
需注意点:
日志格式化输出, 信息易读性
日志文件切割存储, 定时清理, 减少内存占用
模块包可配置化
日志优先级
参考链接
https://www.npmjs.com/package/log4js // 官网
https://cloud.tencent.com/developer/article/1610017
https://blog.csdn.net/huzzzz/article/details/103191803/
简易流程
打印日志的分级
日志文件的输出
日志模块的配置文件
路由请求都需要记录, 利用中间件记录请求
安装
winston的安装
npm install --save nest-winston winston
npm install winston-daily-rotate-file
log4js的安装
https://www.npmjs.com/package/log4js
npm install log4js
npm add log4js stacktrace-js -S
使用
设置日志的输出 appender
我们可以通过 log4js.configure 来设置我们想要的 appender。
var log4js = require('log4js');
log4js.configure({
appenders: [{
type: 'file',
filename: 'default.log'
}]
})
var logger = log4js.getLogger('custom-appender');
logger.debug("Time:", new Date());
利用中间件定义接口数据 中间件
请求url过来时, 需要记录并写入log文件
// 1. 创建中间件文件
nest g middleware logger middleware
在文件中定义 日志等信息,用于全局使用
// 2. 在 app.module 文件中使用
全局中间件 只能使用函数式中间件
// 3. 在main.ts 中注册
app.use(logger); // 全局中间件的注册
参考链接:
https://blog.csdn.net/qq_42852301/article/details/103295541
利用拦截器获取出参拦截器
入参可以使用中间件获取,出参信息需要使用 interceptors (拦截器)进行获取, 所有的参数都会经过这里进行处理
// 1. 创建拦截器
nest g interceptor transform interceptor
// 2. 编写出参打印逻辑
intercept 接受两个参数,当前的上下文和传递函数,这里还使用了 pipe(管道)
// 3. 使用,在main 注册
useGlobalInterceptors 调用全局拦截器:
捕捉异常处理 过滤器
开发时,会有各种的bug, 异常的捕获与抛出也需要进行记录,
// 1. 创建
nest g filter http-exception filter // http相关的异常
nest g filter any-exception filter // 项目中所有的异常
集成typemysql
想将 typeorm的日志 也集成写入log4js中,参考大佬文章 [https://blog.csdn.net/huzzzz/article/details/103191803/]
以及typeorm的官方文档 [https://typeorm.biunav.com/zh/logging.html#%E6%9B%B4%E6%94%B9%E9%BB%98%E8%AE%A4%E8%AE%B0%E5%BD%95%E5%99%A8]
直接在配置项更改即可
import { createConnection } from "typeorm";
import { MyCustomLogger } from "./logger/MyCustomLogger";
createConnection({
name: "mysql",
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test",
logger: new MyCustomLogger()
});
出现的一些问题解决
// Cannot find name 'require'. Do you need to install type definitions for node
- npm install @types/node --save-dev