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

php做购物网站系统学院管理网站建设

php做购物网站系统,学院管理网站建设,广告网站定制,wordpress直播平台众所周知,nest是自带日志的。但是好像没有log4j香,所以咱们来用log4j吧~ 我只演示最简单的用法,用具体怎么样用大家可以自己进行封装。就像前端封装自己的请求一样。 一、安装 yarn add log4js stacktrace-js 二、使用 主要就三个文件&a…

众所周知,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

http://www.yayakq.cn/news/442026/

相关文章:

  • 怒江企业网站建设网站安全检测中心
  • server2008做DNS与网站如何做软件开发
  • 西安seo网站设计公司微信小程序线上商城怎么做
  • 做营销策划要用到哪些网站商业策划公司十大公司
  • 无网站网络营销域名网站有哪些
  • 做板子焊接的网站的公司名字外国网站签到做任务每月挣钱
  • 江苏省建设执业资格注册中心网站如何更改 网站 关键词
  • 岳阳网站定制优质的成都网站建设推
  • 做网站360好还是百度好甘肃住房建设厅网站
  • 建设银行官网网站首页纪念币预约东营注册公司
  • 中国建设通网站网站数据库 mysql
  • 监利网站滨海网站建设服务商
  • 多多进宝怎么做自己网站东莞营销型网站建设费用
  • 网站建设的维护与更新青岛软件开发公司
  • dedecms 调用 两个网站网站开发选题背景
  • 温州建设银行网站丹阳网站建设制作
  • php与mysql网站开发全接触企业如何做网络推广
  • 怎样建设网站后台网站制作需要多少钱
  • 淮北论坛招聘网seo建站还有市场吗
  • j2ee大型网站开发框架wordpress注册登录小工具
  • 网站合同租房子网站怎么做
  • wordpress菜单前面加图标网站模板对seo的影响
  • c 网站开发 视频网页设计与网站制作视频教程
  • 看p站用什么浏览器免费创建属于自己的网站
  • 中国搜索提交网站做公司网站有什么需要注意的
  • 做百度网站要多少钱百度网盘登录入口 网页
  • 销售网站建设推广如何在亚马逊上开店卖到国外
  • 网站优化的核心不包括公司网站开发的流程
  • 做网站的技术困难制作网站的图片素材
  • 七夕表白网站制作wordpress微信公众号推送