日志分析删除
日志分析
场景
运维嫌弃生产环境打印日志过多,而且日志存储需要费用,让我们减少打印日志大小,所以需要分析日志在哪里打印的过多
解决方案
读取生产日志文件,统计分析打印日志的地方,最后删除代码中打印日志的地方
实现-LogParAnalyzer
public class LogParAnalyzer {//日志原始文件private File log;private List<Pattern> list;private ExecutorService executorService;//生成的分割文件private String subPath = "D:\\split\\";private List<File> files;public LogParAnalyzer(File log, List<String> patterns) {this.log = log;executorService = Executors.newFixedThreadPool(30);list = new ArrayList<>();try {for (String pattern : patterns) {Pattern p = Pattern.compile(pattern);list.add(p);}} catch (Exception e) {throw new RuntimeException(e);}}public void analyze() throws Exception {// 使用 try-with-resources 自动关闭 BufferedReaderint chunkSize = 100000;try (BufferedReader reader = new BufferedReader(new FileReader(log))) {File file = new File(subPath);if (!file.exists()) {file.mkdirs();}String line;List<CompletableFuture<?>> task = new ArrayList<>();int cur = 0;List<String> list = new ArrayList<>();AtomicInteger batch = new AtomicInteger(0);while ((line = reader.readLine()) != null) {//sb 会通过Arrays.copy复制字节数组,内存频繁复制list.add(line);cur++;if ((cur % chunkSize) == 0) {//深拷贝List<String> tt = list.stream().map(String::new).collect(Collectors.toList());list.clear();CompletableFuture f =CompletableFuture.runAsync(() -> processChunk(tt, batch.get()), executorService);task.add(f);batch.incrementAndGet();}}if (list.size()>0) {CompletableFuture f =CompletableFuture.runAsync(() -> processChunk(list, batch.get()), executorService);task.add(f);}//等待所有任务结束CompletableFuture.allOf(task.toArray(new CompletableFuture[0])).get();System.out.println("task execute finished");}}private void processChunk(List<String> lines, int batch) {try {System.out.println(Thread.currentThread().getName()+" execute "+ batch+".txt start");Map<String, AtomicInteger> map = new HashMap<>();try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(subPath + batch + ".txt"))) {lines.forEach(line -> {for (Pattern pattern : list) {Matcher matcher = pattern.matcher(line);if (matcher.find()) {String group = matcher.group(0);map.computeIfAbsent(group, k -> new AtomicInteger(1)).incrementAndGet();}}if (map.size() > 0) {//每个文件只保存100前100条writeBatchToFile(writer, map);}});}System.out.println(Thread.currentThread().getName()+" execute "+ batch+".txt end");} catch (Exception e) {e.printStackTrace();}}private void writeBatchToFile(BufferedWriter writer, Map<String, AtomicInteger> map) {Map<String, AtomicInteger> limit = limit(map, 100);try {for (Map.Entry<String, AtomicInteger> entry : limit.entrySet()) {writer.write(entry.getKey() + "=" + entry.getValue().get());writer.newLine();}} catch (IOException e) {e.printStackTrace();}//清除缓存map.clear();limit.clear();}public void mergeAndSort() throws Exception {files = Files.list(Paths.get(subPath)).map(Path::toFile).filter(f -> f.length() > 0).collect(Collectors.toList());// 创建 ForkJoinPoolForkJoinPool forkJoinPool = new ForkJoinPool();MergeFileTask mergeFileTask = new MergeFileTask(files.toArray(new File[0]), forkJoinPool);Path finalPath = mergeFileTask.invoke();System.out.println("final path: " + finalPath.toAbsolutePath());try (BufferedReader reader = Files.newBufferedReader(finalPath)) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}}mergeFileTask.finished();}public void finished() throws IOException {if (!CollectionUtils.isEmpty(files)){files.stream().parallel().forEach(File::delete);}Files.deleteIfExists(Paths.get(subPath));}public Map<String, AtomicInteger> limit(Map<String, AtomicInteger> map, int limit) {// 排序并过滤结果return map.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.comparing(AtomicInteger::get).reversed())).limit(limit).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(oldValue, newValue) -> oldValue, // 解决键冲突LinkedHashMap::new));}}
测试
@Test
public void bb() throws Exception {StopWatch stopWatch = new StopWatch();stopWatch.start();File log = new File("E:\\log_total.log\\log_total.log");//2023-09-26 11:10:00.123 INFO - none --- [main] com.example.service.UserService.create:42 - User service started successfully.//匹配出 com.example.service.UserService.create:42//c.y.c.w..*指文件名太长,缩写List<String> list = Arrays.asList("(com\\.xx\\.[\\w\\.\\*]*:\\d*)", "(c\\.y\\.c\\.[\\w\\.\\*]*:\\d*)");LogParAnalyzer logAnalyzer = new LogParAnalyzer(log, list);logAnalyzer.analyze();logAnalyzer.mergeAndSort();logAnalyzer.finished();stopWatch.stop();System.out.println(stopWatch.prettyPrint());//最后统计格式//c.y.c.s.service.impl.Service.complete:98 count: 6
}
good luck!
相关文章:
日志分析删除
日志分析 场景 运维嫌弃生产环境打印日志过多,而且日志存储需要费用,让我们减少打印日志大小,所以需要分析日志在哪里打印的过多 解决方案 读取生产日志文件,统计分析打印日志的地方,最后删除代码中打印日志的地方…...
DART: Implicit Doppler Tomography for Radar Novel View Synthesis 笔记
Link:https://wiselabcmu.github.io/dart/ Publish: 2024CVPR Abstract DART主要任务就是用来合成雷达距离多普勒图像range-droppler,可用于生成高质量的断层扫描图像。 Related Work 1 Radar Simulation 基于模型的方法 任务ÿ…...
redis-cli执行lua脚本
连接redis服务器命令 redis-cli -h 10.10.xx.xx -p 6380 -a password执行lua脚本传递KEY VALUE redis-cli -h 10.10.xx.xx -p 6380 -a password key1 key2 , arg1 arg2key和参数通过逗号分割,逗号前后必须有一个空格 如下执行lua脚本示例: -- script.…...
MySQL9的3个新特性
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) 本文讲解MySQL9的3个新特性&…...
《网络基础之 HTTP 协议:状态码含义全解析》
《网络基础之 HTTP 协议:状态码含义全解析》 在网络通信的浩瀚世界中,HTTP 协议犹如一座坚实的桥梁,连接着客户端与服务器。而其中的状态码,则是这座桥梁上的重要标识,为双方的交互提供了关键的反馈信息。 一、状态码…...
java真的正在越来越失去竞争力了吗
题记: java真的在越来越失去竞争力了吗?最近参加校招面试,过程中有问道java的问题,有的同学很直接了当(或者是不假思索)地说,java已经过时了吧,现在学java的人越来越少了。那么事实…...
【通过zip方式安装mysql服务】
通过zip方式安装mysql服务 Mysql安装包下载mysql安装及环境配置1.解压缩配置环境变量初始化mysql配置安装mysql服务启动MySQL服务连接mysql修改root用户密码 Mysql安装包下载 通过访问mysql官网下载:mysql下载地址 mysql安装及环境配置 1.解压缩 下载完成后&am…...
每日OJ题_WY3小易的升级之路_数学模拟_C++_Java
目录 牛客_WY3小易的升级之路_数学模拟 题目解析 C代码 Java代码 牛客_WY3小易的升级之路_数学模拟 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 描述: 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段…...
python xml的读取和写入
import xml.etree.ElementTree as ET from xml.dom import minidom# 读取XML文档 tree ET.parse("./xml_3/z_20240827_001.xml") root tree.getroot() # 获取size元素 size_find_0 root.find("size") # 获取width子元素 size_w size_find_0.find("…...
WebGL 小白入门学习
1. WebGL是什么? WebGL(Web Graphics Library)是一种JavaScript API,它允许你在不需要安装任何额外插件的情况下,直接在浏览器中渲染高性能的2D和3D图形。WebGL利用了用户的图形处理单元(GPU)来…...
OSI七层协议
OSI(Open System Interconnection)七层协议,即开放式系统互联参考模型,是一个由国际标准化组织(ISO)提出的用于描述计算机网络中通信的结构和功能的理论模型。它将网络通信过程分为七个层次,每个…...
超平面(Hyperplane)和半空间(Halfspace)
文章目录 一、超平面(Hyperplane)1. 定义2. 超平面的方程3. 例子4. 超平面的性质 二、半空间(Halfspace)1. 定义2. 半空间的表示3. 半空间的性质 三、超平面与半空间的关系四、应用1. 线性规划2. 机器学习3. 计算几何4. 凸分析 五…...
TCP(Transmission Control Protocol,传输控制协议)整理
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的传输协议,它是OSI(Open System Interconnection,开放式系统互联)模型中的第四层协议,通常使用于网络中的…...
R语言绘制线性回归图
线性回归图以二维坐标系展示两个变量关系。数据点代表实际观测值,核心是线性回归线。此线通过统计方法确定,与数据点距离平方和最小。它反映变量间线性趋势,斜率正负决定相关方向。可用于预测因变量值,也能进行推断统计。在数据分…...
C++进阶:map和set的使用
目录 一.序列式容器和关联式容器 二.set系列的使用 2.1set容器的介绍 2.2set的构造和迭代器 2.3set的增删查 2.4insert和迭代器遍历的样例 2.5find和erase的样例 编辑 2.6multiset和set的差异 2.7简单用set解决两道题 两个数组的交集 环形链表二 三.map系列的使用…...
深入理解C++ STL中的 vector
文章目录 1. vector 的概述1.1 vector 是什么?1.2 vector 的优点1.3 vector 的缺点 2. vector 的基本使用2.1 vector 的定义2.2 基本操作2.3 示例2.4 迭代器的使用 3. vector 的内部实现原理3.1 动态数组的实现3.2 内存管理3.3 内存扩展策略3.4 元素的插入与删除3.4…...
MySQL 安装与配置详细教程
MySQL 安装与配置详细教程 MySQL 是一款流行的关系型数据库管理系统,广泛应用于 Web 应用和应用程序中。在本文中,我们将提供一份详细的 MySQL 安装与配置教程,帮助初学者快速上手。 ## 1. 安装 MySQL 首先,我们需要从 MySQL 官…...
理解智能合约:区块链在Web3中的运作机制
随着区块链技术的不断发展,“智能合约”这一概念变得越来越重要。智能合约是区块链应用的核心之一,正在推动Web3的发展,为数字世界带来了前所未有的自动化和信任机制。本文将深入探讨智能合约的基本原理、运作机制,以及它在Web3生…...
QT工程概述
在Qt中,创建 "MainWindow" 与 "Widget" 项目的主要区别在于他们的用途和功能范围: MainWindow:这是一个包含完整菜单栏、工具栏和状态栏的主窗口应用程序框架。它适合于更复 杂的应用程序,需要这些额外的用户…...
redis安装 | 远程连接
1.redis的安装 在Ubuntu下安装redis【网址】使用root账号使用apt来安装。使用apt安装比较的方便,但是安装的版本可能就不是最新的版本。 $ su root $ apt list --installed | grep redis # 查看是否安装 $ apt search redis # 查看apt中的redis版本 $ apt install…...
CentOS部署PHP项目完整步骤
CentOS 7.9 部署 PHP 7.4 MySQL 5.7.44 完整步骤 由于 CentOS 7 已于 2024 年 6 月 30 日停止官方维护,原有的 yum 源已不可用,因此必须首先更换为阿里云镜像源才能正常安装软件。 一、系统环境准备 1.1 更换阿里云 YUM 源 # 1. 备份原有源 mv /etc/yum…...
智能转换驱动科研效率:DeTikZify重构学术图表自动化新范式
智能转换驱动科研效率:DeTikZify重构学术图表自动化新范式 【免费下载链接】DeTikZify Synthesizing Graphics Programs for Scientific Figures and Sketches with TikZ 项目地址: https://gitcode.com/gh_mirrors/de/DeTikZify 在科研成果可视化的关键环节…...
MCP 会不会成为 AI 系统的“新中间件”?
一、为什么人们开始把 MCP 和“中间件”类比?(Why Do People Start Comparing MCP to “Middleware”?)1、MCP 出现的位置非常“熟悉”(MCP Appears in a Very Familiar Position)当人们第一次在企业架构中引入 MCP 时…...
如何用Python免费下载B站4K大会员视频:bilibili-downloader完整指南
如何用Python免费下载B站4K大会员视频:bilibili-downloader完整指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为…...
HackBar插件许可绕过实战:从旧版降级到源码修改
1. HackBar插件许可验证问题解析 最近不少安全测试同行反馈,HackBar插件突然弹出许可验证窗口,导致无法正常使用。这个问题其实从2.2.0版本开始就存在了,开发者加入了商业化验证机制。作为一个用了HackBar五年的老用户,我完全理解…...
不止基础管理!国产 CRM 软件如何用数据分析赋能客户与销售工作
引言2026年国内企业数字化转型已进入深水区,CRM早已脱离了单纯的客户信息台账工具属性,数据分析能力成为衡量CRM产品价值的核心指标——从线索获客成本核算到跟单转化率优化,从客户复购价值挖掘到全链路风险管控,高质量的数据分析…...
2026年中国企业AI应用场景报告
当多模态技术突破模态壁垒,当超级智能体成为业务重构的核心执行者,AI 正从实验室走向产业深水区,成为企业降本增效、创新增长的关键引擎。但与此同时,“AI 应用停留在工具层面”“落地效果不及预期”“行业场景适配难” 等痛点&am…...
STM32 TIM编码器模式实战:如何精准计算步进电机闭环控制的脉冲对应关系?
STM32 TIM编码器模式实战:步进电机闭环控制中的脉冲精确换算 步进电机在工业自动化、3D打印和精密仪器中扮演着关键角色,而闭环控制则是确保其运动精度的核心技术。许多工程师在实现闭环控制时,常常困惑于如何准确建立编码器脉冲与电机控制脉…...
数字工作流革命:Input Leap如何重塑你的多设备生产力体验
数字工作流革命:Input Leap如何重塑你的多设备生产力体验 【免费下载链接】input-leap Open-source KVM software 项目地址: https://gitcode.com/gh_mirrors/in/input-leap 想象一下这样的场景:你的左手边是Windows台式机处理着复杂的3D渲染&…...
2026进口调节阀品牌选型参考:产品质量与售后响应如何影响实际应用
2026年,进口调节阀在石油化工、电力、制药、冶金和新能源项目中仍有稳定需求。用户在查找进口调节阀品牌或调节阀厂家时,比较关注产品的认证情况、制造基地布局、工况适应能力和服务响应速度。本文整理了一些选型时常见的考虑要点,并介绍美国…...
