【从后端日志文件中过滤出sql语句】

news2024/10/6 6:05:36

从后端日志文件中过滤出sql语句

  • why?
    • 思路
      • 日志文件的格式
    • 结果

why?

为什么会有这种需求?,mysql数据不小心被删了完全可以从备份数据恢复,或者从binlog中恢复,但是如果前面这两种方法没办法处理(没有备份数据库文件、没有binlog日志😨),如果后端日志里面有sql语句的话理论上是可以提取出来做恢复的。

思路

  • 分析日志文件结构
  • 根据关键信息把日志文件一条一条的读出来存储在数组里面
  • 根据关键字匹配出你需要的日志记录
  • 处理匹配出来的日志
  • 把日志处理成sql文件存储下来

日志文件的格式

在这里插入图片描述

const fs = require('fs');
const path = require('path');

const logDir = './info';
const keywords = ['INSERT INTO life', '100209102']; // 要匹配的关键字数组 匹配出来的数据必须同时满足匹配的关键字
const outputFilePath = path.join(__dirname, 'filtered_logs.sql');
const prefixToRemove = '可执行sql='; // 删除多余的日志前缀信息
const datePattern = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d+)?)?/g;
const englishSemicolon = ';';

const logStartPattern = /(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+)/g;

const processFile = (filePath) => {
  const readStream = fs.createReadStream(filePath, { highWaterMark: 64 * 1024 });
  let lastLogEntry = '';

  readStream.on('data', (chunk) => {
    const data = lastLogEntry + chunk.toString();
    const logEntries = data.split(logStartPattern);
    lastLogEntry = logEntries.pop();

    for (const logEntry of logEntries) {
      if (keywords.every(keyword => logEntry.includes(keyword))) {
        const trimmedLogEntry = trimLogEntry(logEntry);
        const formattedLogEntry = formatDateInLogEntry(trimmedLogEntry);
        const logEntryWithSemicolon = `${formattedLogEntry}${englishSemicolon}`;
        appendToFile(logEntryWithSemicolon);
      }
    }
  });

  readStream.on('end', () => {
    if (lastLogEntry && keywords.every(keyword => lastLogEntry.includes(keyword))) {
      const trimmedLogEntry = trimLogEntry(lastLogEntry);
      const formattedLogEntry = formatDateInLogEntry(trimmedLogEntry);
      const logEntryWithSemicolon = `${formattedLogEntry}${englishSemicolon}`;
      appendToFile(logEntryWithSemicolon);
    }
  });

  readStream.on('error', (err) => {
    console.error(`读取文件 ${filePath} 失败:`, err);
  });
};

const trimLogEntry = (logEntry) => {
  const prefixIndex = logEntry.indexOf(prefixToRemove);
  if (prefixIndex !== -1) {
    return logEntry.slice(prefixIndex + prefixToRemove.length);
  }
  return logEntry;
};

const formatDateInLogEntry = (logEntry) => {
  return logEntry.replace(datePattern, (match) => `'${match}'`);
};

const appendToFile = (logEntry) => {
  fs.appendFile(outputFilePath, logEntry + '\n', (err) => {
    if (err) {
      console.error('写入文件失败:', err);
    }
  });
};

fs.readdir(logDir, (err, files) => {
  if (err) {
    console.error('读取文件夹失败:', err);
    return;
  }

  files.filter(file => file.endsWith('.log')).forEach(file => {
    const filePath = path.join(logDir, file);
    console.log('读取文件:', filePath)
    processFile(filePath);
  });
});

process.on('exit', () => {
  console.log(`筛选日志完成,已写入 ${outputFilePath}`);
});

结果

处理出来的sql文件做了精简 仅供参考

INSERT INTO life (id, type, title ) VALUES (12, '100209102', );

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

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

相关文章

opencv基础篇 ——(八)图像平滑滤波

均值滤波blur 用于对图像进行均值滤波(Mean Filtering)的函数。它通过对图像中每个像素点邻域内所有像素值求平均来计算新的像素值,以此达到平滑图像、降低噪声和消除细节的目的 函数原型: void cv::blur(InputArray src,Output…

百面算法工程师 | 分类和聚类

目录 6.1 为什么正确率有时不能有效评估分类算法? 6.2 什么样的分类器最好? 6.3 什么是聚类,你知道哪些聚类算法? 6.4 K-Means聚类算法如何调优? 6.5 K-Means聚类算法如何选择初始点? 6.6 K-Means聚类聚的是特征还是样本 …

贪吃蛇身子改进加贪吃蛇向右移动

1. 蛇移动的思想: 其实就是删除头节点 ,增加尾节点;一句代码搞定 struct Snake *p; p head; head head -> next; free(p) 防止造成多的空间节点 2.增加尾节点代码思想: 2.1 .开辟new 节点的空间 struct Snake *new (stru…

2015年中国电子地图数据

这是一份收藏得比较久的电子地图数据,虽然很比较旧,但数据内容很丰富,它可以在一些GIS系统中作测试用。 2015中国电子地图 2015年中国电子地图数据的压缩包有3.29GB大小,如下图所示。 压缩文件大小 该数据进行解压之后&…

CentOS 7虚拟机配置过程中所需组件的安装(二)

1.安装net-tools组件(解决无 ifconfig) # yum install net-tools 2.安装gcc、c编译器以及内核文件 # yum -y install gcc gcc-c kernel-devel 验证安装成功 3.安装nano(文本编辑器) # yum install nano

Qt 把.exe打包成安装文件形式

目录 1.下载工具 Qt Installer Framework2.将bin文件添加到环境变量3.拷贝startmenu示例-备用4.准备Qt Release打包好的程序5.把Release打包好的程序放到packages\org.qtproject.ifw.example\data文件夹下6.生成安装包7.修改安装包图标8.修改主程序程序安装引导-创建快捷键9.添…

vue快速入门(四十四)自定义组件

注释很详细,直接上代码 上一篇 新增内容 全局注册自定义组件并应用局部注册自定义组件并应用 此篇使用了axios模块没有安装导入的先看这一篇 axios模块下载与导入 源码 main.js import Vue from vue import App from ./App.vue//全局引入axios // 引入axios impor…

(九)Pandas表格样式 学习简要笔记 #Python #CDA学习打卡

目录 一. Pandas表格样式 1)举例数据 2)字体颜色 3)背景高亮 4)极值背景高亮 (a)高亮最大值 highlight_max() (b)高亮最小值 highlight_min() (c)同时…

viewerjs在vue中实现点击图片预览、切换、缩放、拖拽、旋转等功能

1、下载依赖&#xff1a; npm i viewerjs 2、定义html结构 <template> <div><ul class"artBody"><li><img src"picture-1.jpg" alt"Picture 1"></li><li><img src"picture-2.jpg" alt&…

WinForm右键菜单的快键键设置

Form中有一个富文本框控件&#xff0c;在里面右键鼠标&#xff0c;弹出下拉菜单。快捷键的效果则是按下altp,触发按下属性事件。 1.从工具箱添加RichTextBox 2.然后添加ContextMenuStrip 3.选择RichTextBox的ContextMenuStrip属性值为contextMenuStrip1 4.按照下图设置“属…

基于Python实现心脏病数据可视化DEA+预测【500010103.1】

一、数据说明 该心脏病数据集是通过组合 5 个已经独立可用但以前未合并的流行心脏病数据集来策划的。在这个数据集中&#xff0c;5 个心脏数据集结合了 11 个共同特征&#xff0c;使其成为迄今为止可用于研究目的的最大心脏病数据集。 该数据集由 1190 个实例和 11 个特征组成…

Springboot+Vue项目-基于Java+MySQL的IT技术交流和分享平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【人工智能】AIGC(Artificial Intelligence Generated Content)

随着生成式 AI 应用快速进入市场&#xff0c;以及越来越多大模型的不断面世&#xff0c;2023 年已经成为生成式 AI 的元年&#xff1a;不同区域、各行各业、不同领域的人们开始尝试在工作和生活中使用生成式 AI&#xff0c;以探索各种可能性。于企业而言&#xff0c;生成式 AI …

Matlab图像处理-均值滤波,中值滤波和高斯滤波。

针对添加了零均值高斯噪声的图像&#xff0c;以取得尽可能好的处理效果为目的&#xff0c;采用不少于3种方法进行处理&#xff1b;对处理结果进行定性和定量的比较、并得出相应的结论。 1.算法原理&#xff1a; 采用的图像滤波包括均值滤波&#xff0c;中值滤波和高斯滤波。 …

算法基础:并查集详解

并查集 并查集&#xff0c;在一些有N个元素的集合应用问题中&#xff0c;我们通常是在开始时让每个元素构成一个单元素的集合&#xff0c;然后按一定顺序将属于同一组的元素所在的集合合并&#xff0c;其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学…

【网络编程】网络编程概念 | TCP和UDP的区别 | UDP数据报套接字编程 | Socket

文章目录 网络编程一、什么是网络编程1.TCP和UDP的区别 二、UDP数据报套接字编程DatagramSocketDatagramPacket回显服务器&#xff08;echo server&#xff09; 网络编程 一、什么是网络编程 通过网络&#xff0c;让两个主机之间能够进行通信。基于通信来完成一定的功能。 ​…

Linux网络-DNS域名解析服务

目录 一.DNS相关介绍 1.DNS是什么 2.DNS系统的分布式数据结构 根域 顶级域 二级域 子域 主机 3.服务器类型 主域名服务器 从域名服务器 缓存域名服务器 转发域名服务器 二.DNS域名解析 1.DNS域名解析方式及功能 2.DNS域名解析查询方式 2.1.递归查询&#xff0…

Verilog基础语法——parameter、localparam与`define

Verilog基础语法——parameter、localparam与define 写在前面一、localparam二、parameter三、define写在最后 写在前面 在使用Verilog编写RTL代码时&#xff0c;如果需要定义一个常量&#xff0c;可以使用define、parameter和localparam三种进行定义与赋值。 一、localparam …

施耐德EOCR-2CT-300/5电流互感器 50HZ 5VA

EOCR主要产品有电子式电动机保护继电器&#xff0c;电子式过电流继电器&#xff0c;电子式欠电流继电器&#xff0c;电子式欠电压继电器&#xff0c;其它保护和监视装置&#xff0c;电流互感器。 施耐德EOCR-2CT-300/5电流互感器 EOCR-2CT系列型号&#xff1a; EOCR 2CT 100…

操作系统安全:Linux安全审计,Linux日志详解

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…