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

2024-04-26 11:44

本文主要是介绍【从后端日志文件中过滤出sql语句】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从后端日志文件中过滤出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', );

这篇关于【从后端日志文件中过滤出sql语句】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937496

相关文章

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

Mysql表如何按照日期字段的年月分区

《Mysql表如何按照日期字段的年月分区》:本文主要介绍Mysql表如何按照日期字段的年月分区的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、创键表时直接设置分区二、已有表分区1、分区的前置条件2、分区操作三、验证四、注意总结一、创键表时直接设置分区

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进