网站建设分哪几个版块,主图模板,3d设计房子的软件,怎么推广软件让别人下载众所周知#xff0c;nest是自带日志的。但是好像没有log4j香#xff0c;所以咱们来用log4j吧~
我只演示最简单的用法#xff0c;用具体怎么样用大家可以自己进行封装。就像前端封装自己的请求一样。
一、安装
yarn add log4js stacktrace-js
二、使用
主要就三个文件nest是自带日志的。但是好像没有log4j香所以咱们来用log4j吧~
我只演示最简单的用法用具体怎么样用大家可以自己进行封装。就像前端封装自己的请求一样。
一、安装
yarn add log4js stacktrace-js
二、使用
主要就三个文件配置log4j文件、中间件文件、main.ts
配置log4j文件src/utils/log4j.ts
import * as Path from path;
import * as Log4js from log4js;
import * as Util from util;
import * as Moment from moment; // 处理时间的工具
import * as StackTrace from stacktrace-js;
import Chalk from chalk;
import config from ../config/log4js;// 日志级别
export enum LoggerLevel {ALL ALL,MARK MARK,TRACE TRACE,DEBUG DEBUG,INFO INFO,WARN WARN,ERROR ERROR,FATAL FATAL,OFF OFF,
}// 内容跟踪类
export class ContextTrace {constructor(public readonly context: string,public readonly path?: string,public readonly lineNumber?: number,public readonly columnNumber?: number,) {}
}Log4js.addLayout(Awesome-nest, (logConfig: any) {return (logEvent: Log4js.LoggingEvent): string {let moduleName ;let position ;// 日志组装const messageList: string[] [];logEvent.data.forEach((value: any) {if (value instanceof ContextTrace) {moduleName value.context;// 显示触发日志的坐标行列if (value.lineNumber value.columnNumber) {position ${value.lineNumber}, ${value.columnNumber};}return;}if (typeof value ! string) {value Util.inspect(value, false, 3, true);}messageList.push(value);});// 日志组成部分const messageOutput: string messageList.join( );const positionOutput: string position ? [${position}] : ;const typeOutput [${logConfig.type}] ${logEvent.pid.toString()} - ;const dateOutput ${Moment(logEvent.startTime).format(YYYY-MM-DD HH:mm:ss,)};const moduleOutput: string moduleName? [${moduleName}] : [LoggerService] ;let levelOutput [${logEvent.level}] ${messageOutput};// 根据日志级别用不同颜色区分switch (logEvent.level.toString()) {case LoggerLevel.DEBUG:levelOutput Chalk.green(levelOutput);break;case LoggerLevel.INFO:levelOutput Chalk.cyan(levelOutput);break;case LoggerLevel.WARN:levelOutput Chalk.yellow(levelOutput);break;case LoggerLevel.ERROR:levelOutput Chalk.red(levelOutput);break;case LoggerLevel.FATAL:levelOutput Chalk.hex(#DD4C35)(levelOutput);break;default:levelOutput Chalk.grey(levelOutput);break;}return ${Chalk.green(typeOutput)}${dateOutput} ${Chalk.yellow(moduleOutput,)}${levelOutput}${positionOutput};};
});// 注入配置
Log4js.configure(config);// 实例化
const logger Log4js.getLogger();
logger.level LoggerLevel.TRACE;export class Logger {static trace(...args) {logger.trace(Logger.getStackTrace(), ...args);}static debug(...args) {logger.debug(Logger.getStackTrace(), ...args);}static log(...args) {logger.info(Logger.getStackTrace(), ...args);}static info(...args) {logger.info(Logger.getStackTrace(), ...args);}static warn(...args) {logger.warn(Logger.getStackTrace(), ...args);}static warning(...args) {logger.warn(Logger.getStackTrace(), ...args);}static error(...args) {logger.error(Logger.getStackTrace(), ...args);}static fatal(...args) {logger.fatal(Logger.getStackTrace(), ...args);}static access(...args) {const loggerCustom Log4js.getLogger(http);loggerCustom.info(Logger.getStackTrace(), ...args);}// 日志追踪可以追溯到哪个文件、第几行第几列static getStackTrace(deep 2): string {const stackList: StackTrace.StackFrame[] StackTrace.getSync();const stackInfo: StackTrace.StackFrame stackList[deep];const lineNumber: number stackInfo.lineNumber;const columnNumber: number stackInfo.columnNumber;const fileName: string stackInfo.fileName;const basename: string Path.basename(fileName);return ${basename}(line: ${lineNumber}, column: ${columnNumber}): \n;}
}中间件文件src/middleware/logger.middleware.ts
import { Request, Response } from express;
import { Logger } from ../utils/log4js;// 函数式中间件
export function logger(req: Request, res: Response, next: () any) {const code res.statusCode; // 响应状态码next();// 组装日志信息const logFormat 请求参数Request original url: ${req.originalUrl}Method: ${req.method}IP: ${req.ip}Status code: ${code}Parmas: ${JSON.stringify(req.params)}Query: ${JSON.stringify(req.query)}Body: ${JSON.stringify(req.body,)} \n ;// 根据状态码进行日志类型区分if (code 500) {Logger.error(logFormat);} else if (code 400) {Logger.warn(logFormat);} else {Logger.access(logFormat);Logger.log(logFormat);}
}main.ts
import { logger } from ./middleware/logger.middleware;async function bootstrap() {const app await NestFactory.create(AppModule, { logger: console });app.use(logger);
}
bootstrap();
然后就可以记录日志辣~稍微详细一点的可以参考这位老哥的https://blog.csdn.net/fwzzzzz/article/details/116160816