NodeJs 使用中间件实现日志生成功能

news2024/11/20 12:37:04
写在前面

今天我们实现一个记录 nodejs 服务请求日志的功能,大概的功能包括请求拦截,将请求的信息作为日志文件的内容写入到 txt 文件中,然后输出到指定的日志到当天日期目录中,从而实现后续查找用户请求信息的功能,下面的内容有一部分是之前文章中实现过的,需要的可以移步
NodeJs 连接本地 mySql 数据库获取数据
NodeJs实现对本地 mysql 数据库的增删改查
上面有对mysql 数据的链接 本地服务的启动和对数据库的 CURD 基本操作实现。

文件写入功能封装
/**
 * @author clearlove
 * @use 文件的写入操作
 * @fileName utils/index.js
 */
 const fs = require('fs')
/**
 * @param  {[type]} 文件名字
 * @param  {String} 编码格式
 * @param  {[type]} 文件路径
 * @param  {[type]} 写入内容
 * @return {[type]} 写入函数操作
 */
const writeFileToFolder = (fileName, enCoding = 'utf-8', filePath, writeContent) => {
    fs.writeFile(`${filePath}${fileName}`, writeContent, enCoding, (err, data) => {
        if (err) {
            throw err
        } else {
            console.log('logger write is success');
        }
    });
}

module.exports = {
    writeFileToFolder
}
实现中间件
/**
 * @author clearlove
 * @aim 日志中间件
 */
const moment = require('moment');
const fs = require('fs');
const utils = require('../../fileOptinos//utils//index.js')
const loggerPath = '/Users/weileiming/sublime/front/nodeJsLinkMysql/logs/';

const logsMiddleWare = (req, res, next) => {
    // 当天文件夹名
    const folderName = moment().format('YYYY-MM-DD')
    // 日志文件名
    const fileName = `/log${new Date().getTime()/1000}.txt`
    // 输出日志内容
    const loggerContent = {
        reqContent: req.body,
        reqUrl: req.originalUrl,
        time: new Date().toString(),
    }
    // 创建文件夹
    fs.mkdir(`${loggerPath}/${folderName}`, { recursive: true }, (err) => {
        if (err) throw err;
        // 写入日志内容
        utils.writeFileToFolder(`${folderName}${fileName}`, 'utf-8', loggerPath, JSON.stringify(loggerContent))
        next()
    });
}


module.exports = logsMiddleWare
引入全局中间件

这里是使用全局中间件的方式实现,自己实现的时候可以根据实际情况判断是不是需要引入全局的中间件进行处理

/**
 * @author 是悟能了
 * @aim 实现基础服务
 * @fileName baseServer.js
 */

const express = require('express');
const bodyParser = require('body-parser');
const logsMiddleWare = require('./middleWares/logMiddleWare/index.js')
const serve = express();
const port = 8000;

// TODO: 解析获取到的 json 数据
serve.use(bodyParser.urlencoded({
	extended: false
}));
serve.use(bodyParser.json());
// 注册日志中间件
serve.use(logsMiddleWare)

serve.listen(port, () => {
	console.log(`serve is running...port = ${port}`);
});

module.exports = serve;
效果测试
  • 调用接口:
    在这里插入图片描述
    在这里插入图片描述

  • 文件目录如上图

多次生成日志目录结构图

在这里插入图片描述

写在最后

基础功能实现了,后续有需要的话,可以将自己的请求部署到远程服务器上进行使用,日志文件也可以直接输出到远程存储桶中进行永久保存,这些可以自己按照需求进行实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1866903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三级医院智慧医院信息化规划方案(65页PPT)

方案介绍: 该方案通过信息化手段实现医院信息化全覆盖,优化诊疗流程、提高诊疗效率和准确性;同时实现医疗资源的合理配置和共享,提升医疗服务质量。通过优化患者就医流程、提供便捷的服务和宣传健康知识等方式提高患者满意度。通…

SpringBoot优点达项目实战:获取系统配置接口(三)

SpringBoot优点达项目实战:获取系统配置接口(二) 文章目录 SpringBoot优点达项目实战:获取系统配置接口(二)1、查看接口2、查看数据库3、代码实现1、创建实体类SysConfig2、创建返回数据的vo3、创建control…

【Unity】RPG2D龙城纷争(六)关卡编辑器之角色编辑

更新日期:2024年6月26日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、角色编辑模式1.将字段限制为只读2.创建角色(刷角色)3.预览所有角色4.编辑选中角色属性5.移动角色位置6.移除角色 简介…

postgres数据库的流复制

1. 流复制和逻辑复制的差异 逻辑复制和流复制最直观的不同是,逻辑复制支持表级别复制区分点事原理不同 逻辑日志是在wal日志产生的数据库上,由逻辑解析模块对wal日志进行初步的解析,解析结果是ReorderBufferChange(理解为HeapTup…

EOS Black延迟高如何处理 EOS Black延迟高这样降低

EOS Black中,玩家可以根据自己的喜好和策略,随心所欲地雕琢人物属性,选择装备属性,搭配千变万化的技能,甚至还可以自定义职业,打造出最适合自己的角色。这种自由度极高的玩法,让玩家能够真正体验…

3D Web轻量引擎HOOPS Web Platform赋能AEC行业数字化,高效渲染与多格式支持!

在建筑、工程和施工(AEC)行业,数字化转型和高效协作正变得越来越重要。为应对日益复杂的项目需求和不断提升的质量标准,AEC企业需要一种强大的工具来实现高效的3D可视化和数据管理。HOOPS Web Platform作为一款综合性3D开发平台&a…

数字图像分析(第二部分)

文章目录 第8章 图像分割图像分割定义阈值分割依赖像素的阈值选取Otsus方法依赖区域的阈值选取依赖坐标的阈值选取变化阈值法区域生长法分裂合并方法分水岭算法聚类分割算法K-meansAP算法Graph cut第9章 图像特征表达基于全局特征的图像表达直方图GIST基于局部特征的图像表达简…

【护眼科普】台灯怎么选对眼睛好?五大适合学生写作业的台灯推荐

作为一位家长,我深切地领悟到保护孩子眼部健康的至关重要性。随着科技的日新月异,孩子们愈发频繁地接触和使用各类电子设备,如平板电脑、手机和电视,屏幕时间几乎占据了他们日常生活的相当一部分。然而,不容忽视的是&a…

openlayers性能优化——开启图层预加载、减少空白等待时间

使用切片图层时、地图拖拽会有空白图片,为了减少空白等待时间,我们可以开始图层预加载。 const map_top new Map({layers: [new TileLayer({preload:Infinity, //预加载source: new StadiaMaps({layer: "outdoors",}),}),],target: "ma…

【5】apollo编写python节点步骤及实例

在workspace/modules下新建包buildtool create --template component modules/test_one 编译包 buildtool build -p modules/test_two/ 增加自己的proto消息 在刚才自动生成的proto文件里面添加自己定义的消息,记得重新编译. syntax "proto2";package apollo;…

网络编程基础知识拾遗:用大白话解释什么是交换机、路由器、光猫、IP地址和子网掩码、公网和内网IP、端口和域名

二层交换机 在没有二层交换机的环境中,两台电脑或多个电脑之间的通信主要依赖于直连方式或共享介质。假如你和你的舍友都有一台电脑,当你们之间想要进行通信的时候,在没有二层交换机的情况下,可以使用网线(为了方便理…

SpringBoot中使用多线程调用异步方法,异步方法有无返回值例子。

快速了解Async注解的用法,包括异步方法无返回值、有返回值,最后总结Async注解失效的几个坑。 在我们的 SpringBoot 应用中,经常会遇到在一个接口中,同时做事情1,事情2,事情3,如果同步执行的话&a…

发电机保护屏产品介绍,组成

发电机保护屏产品介绍,组成 发电机保护屏是用于保护发电机组的电气装置。它根据发电机的类型和实际运行要求,将多种保护装置组合在一起,形成一个保护屏柜。发电机保护测控屏是指把发电机类保护装置集中在安装在一个控制柜里,主要用…

【软件下载】Folx详细安装教程视频-Folx软件最新版下载

根据大数据调查表明Acceleration PRO下载:抽出多达10个流的故障能够显着提高下载速度。根据行业数据显示与iTunes PRO集成:通过将Folx集成到iTunes来下载歌曲和视频,能够在下载后立即自动添加到iTunes库。实际上我们可以这样讲通过代理下载&a…

LabVIEW遇到无法控制国外设备时怎么办

当使用LabVIEW遇到无法控制国外产品的问题时,解决此类问题需要系统化的分析和处理方法。以下是详细的解决思路和具体办法,以及不同方法的分析和比较,包括寻求代理、国外技术支持、国内用过的人请教等内容。 1. 了解产品的通信接口和协议 思路…

小型海外仓布局策略:高效利用有限空间,标准化3F流程

合理高效的仓库空间设计,不只是对大型海外仓很关键。对空间有限的小型海外仓来说或许价值更大。 本身仓储空间就有限,如果还没有科学规划,造成空间浪费,那将直接影响到核心业务的运转。 今天我们就给大家整理了对小型海外仓布局…

制作一个智能体:抖音热点话题文案制作助手

文章目录 第一步,添加助手第二步,选择语聚GPT第三步,填写相关信息第四步,工具中选择抖音(普通号)第五步,选择“查询热门视频数据”第六步,测试总结 这篇文章,我们手把手的演示开发一个智能体&am…

Mysql回表和覆盖索引

一、简述 回表,顾名思义就是回到表中,也就是先通过普通索引扫描出数据所在的行,再通过行主键ID 取出索引中未包含的数据。所以回表的产生也是需要一定条件的,如果一次索引查询就能获得所有的select 记录就不需要回表,…

LLM文本数据集775TB:覆盖32个领域,444个数据集

大语言模型在各领域展现出巨大潜力,其性能在很大程度上依赖于训练和测试所用的数据集。然而,目前在如何构建和优化这些数据集方面,尚缺乏统一的认识和方法论。下面从五个方面整合和分类了LLM数据集的基本内容:预训练语料库、指令微…

在低版本Excel中创建次级下拉列表

在低版本中indirect函数不支持选区,创建次级下拉列表得依靠“名称管理”给选区命名。 (笔记模板由python脚本于2024年06月26日 06:24:22创建,本篇笔记适合常用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www…