【运维】大日志文件按日期划分方法的改进及思考

之前由于运维需求,需要对一个大日志文件按照日期进行划分,将每天的日志写入一个单独的文件中。

刚开始接到这个需求后,我浏览了一遍日志文件,发现里面只有11月17号到11月22号的日志,天数不多,可以尝试手动划分。但一看行数,好几万行,这得拖到什么时候,手指都按麻了。。。

于是我有了一个最初的思路:将文件放到linux系统中,利用cat+grep命令匹配行并输出到指定文件中。由于涉及的天数很少,我很快完成了操作;

1)命令行:cat+grep

# 11月17号的日志
cat message.log | grep 'Nov 17' > Nov_17.log
# 后续日志命令类似
...

那么很自然地,我思考到:如果大日志文件中,涉及的天数很多呢,难道有几十上百天,我就要敲几十上百次命令吗?显然不可能,于是想到了使用脚本自动操作

2)脚本:逐行read追加写

#!/bin/bash# 设置日志文件路径
log_file="messages.log"
# 设置输出目录
output_dir="logs"# 创建输出目录
mkdir -p "$output_dir"# 保存当前日期
current_date=""# 读取日志文件的每一行
while IFS= read -r line
do# 获取日期部分(前两个单词)date=$(echo "$line" | awk '{print $1, $2}')# 检查日期是否改变if [ "$date" != "$current_date" ]; then# 更新当前日期current_date="$date"# 将日期格式化为文件名中可接受的格式(替换空格为下划线)file_name=$(echo "$date" | tr ' ' '_').log# 创建新的日志文件touch "$output_dir/$file_name"fi# 将日志行追加到对应的文件中echo "$line" >> "$output_dir/$file_name"
done < "$log_file"

完成这一步后,我特地找了一个很大的日志文件(40w行)进行测试,发现过程很漫长,足足用了十几分钟,这可太慢了,想来是每次read进行IO操作浪费了不少时间,那么换个思路,将文件内容全部存入数组中,每次遍历去数组中读取内容,在必要的时候一次性将匹配的行全部写入目标文件。

3)脚本:写入数组进行操作,减少IO次数,匹配行号一次性写入

#!/bin/bash# 设置日志文件路径
log_file="$1"
# 设置输出目录
output_dir="logs"
# 将文件写入数组中
mapfile -t file_arr < $log_file
# 开始行
start_line=1
# 结束行
end_line=1
# 创建输出目录
mkdir -p "$output_dir"
#保存当前日期
current_date=""# 读取日志文件的每一行
for ((i=0; i<${#file_arr[@]}; i++)); doecho 当前时间 $(date | awk '{print $4}')# 获取日期部分(前两个单词)date=$(echo ${file_arr[i]} | awk '{print $1, $2}')if [ "$date" != "$current_date" ]; thenif [ "$current_date" != "" ]; then        # 将日期格式化为文件名中可接受的格式(替换空格为下划线)file_name=$(echo "$current_date" | tr ' ' '_').log# 更新结束行end_line=$i# 将上一个日期的结果写入文件中awk -v start=$start_line -v end=$end_line 'NR >= start && NR <= end' $log_file > ${output_dir}/${file_name}# 更新起始行start_line=$((i+1))ficurrent_date=$datefiif [ $((i+1)) == ${#file_arr[@]} ]; then# 最后一个日期的处理file_name=$(echo "$current_date" | tr ' ' '_').logawk -v start=$start_line -v end=$((i+1)) 'NR >= start && NR <= end' $log_file > ${output_dir}/${file_name}fi
done 

我信心满满地进行测试,但等了许久都不见完成。干脆每次循环输出一下当前时间,看看到底怎么回事。这一操作就跑了足足一个多小时,仔细观察终端的输出,发现程序每秒只执行了几十次循环,也不知道为啥如此慢。

我去咨询了一下GPT,说shell是解释型语言,执行效率相比编译型语言还是差一个档次。我用Java编写了同样的代码逻辑,并且是逐行输入,这下仅仅用了几秒钟,就完成了!不愧是高效的编程语言。
4) Java

public class Main {private static String[] fileArr;public static void main(String[] args) throws IOException {String fileDir = "src/test/resources";File file = new File(fileDir+"/messages.log");BufferedReader br = new BufferedReader(new FileReader(file));List<String> fileList = new ArrayList<>();String line;while ((line = br.readLine()) != null) {fileList.add(line);}fileArr = fileList.toArray(new String[0]);System.out.println(fileArr.length);String curDate = "";int startLine = 0;int endLine = 0;for (int i = 0; i < fileArr.length; i++) {String date = fileArr[i].split(" ")[0] + fileArr[i].split(" ")[1];if (!curDate.equals(date)) {if (!"".equals(curDate)) {endLine = i;String fileName = fileDir+"/"+curDate+".log";writeToFile(startLine, endLine, fileName);startLine = i + 1;}// 更新日期curDate = date;}// 最后的日期处理if (i == fileArr.length - 1) {String fileName = fileDir+"/"+curDate+".log";writeToFile(startLine, i, fileName);}}}private static void writeToFile(int startLine, int endLine, String fileName) throws IOException {BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));for (int i = startLine; i <= endLine; i++) {bw.write(fileArr[i]);if (i == endLine){System.out.println(fileArr[i]);}bw.newLine();bw.flush();}}
}

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

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

相关文章

conan 入门(三十七):conan 2.x通过定义环境变量(environment)执行make编译只有Makefile的项目(erpcgen)

之前一篇博客《conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例》介绍如何用AutotoolsToolchain,Autotools实现来编译只有Makefile的项目&#xff0c;因为Autotools.make,Autotools.install方法就是执行make来编译项目。 我原本是想用self.run来执行…

C# 读取Word表格到DataSet

目录 功能需求 Office 数据源的一些映射关系 范例运行环境 配置Office DCOM 关键代码 组件库引入 ​核心代码 杀掉进程 总结 功能需求 在应用项目里&#xff0c;多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求&#xff0c;但某些情况下&#xff0c;也存…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十七:演示功能模块相关功能实现

一、本章内容 本章实现常见业务功能,包括文章管理、商品管理、订单管理、会员管理等功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址:

Jenkins 自动设置镜像版本号

使用Jenkins环境变量当作镜像版本号 这样version变量就是版本号,在镜像构建的过程中可以使用 docker build 之后&#xff0c;如果有自己的镜像库&#xff0c;肯定要docker push 一下 至于部署的步骤&#xff0c;一般需要stop并删除原有的容器.我这里用的是docker-compose。同样…

如何使用 pnpm 实现前端 Monorepo项目管理

前言 随着软件开发项目变得越来越庞大和复杂&#xff0c;如何有效管理和维护代码库成为了一个重要的问题。一种流行的解决方案是 Monorepo&#xff0c;也就是在一个版本控制系统中管理所有的项目代码。 什么是 Monorepo Monorepo 是一种项目代码管理方式&#xff0c;指单个仓…

PHP-8.1.0-dev 后门命令执行漏洞复现_zerodiumvar_dump

0x00漏洞描述 PHP 8.1.0-dev 版本在2021年3月28日被植入后门&#xff0c;但是后门很快被发现并清除。当服务器存在该后门时&#xff0c;攻击者可以通过发送User-Agentt头来执行任意代码。 0x01影响范围 PHP 8.1.0-dev 0x02环境搭建 1、本次环境搭建使用vulhub中的docker环…

加速 SQL 查询的 9 种方法

SQL 是开发和查询数据库的主要语言&#xff0c;但它有一些怪癖。在我的上一篇文章中&#xff0c;我分享了 7 个需要避免的 SQL 错误。现在&#xff0c;让我们来看看编写更快的 SQL 查询的 9 个最佳实践。 更快 SQL 查询的 9 个最佳实践 仅检索您需要的列 使用 CASE 而不是 UP…

PPT中加入页码

PPT中加入页码 文章目录 简单版本样式更改 简单版本 PPT中插入页码&#xff0c;基础的就是在“插入”选项卡中单机“幻灯片编号”即可 样式更改 然而&#xff0c;就像我们做幻灯片不满足于白底黑字一样&#xff0c;页码也总不能是默认的样式。 比如&#xff0c;在页码下面…

2023年全国省市区县行政区划矢量数据(含10段线)

2023年&#xff0c;中国地图面貌发生了重大变化&#xff0c;领土面积由960万平方公里扩大到1045万平方公里&#xff0c;九段线改为了十段线。 因此在使用地图的时候&#xff0c;特别是做全国的地图的时候&#xff0c;一定需要最新的行政界限&#xff0c;今天就将最新的省市县行…

http请求超时 ,用PHP如何解决的?

当进行HTTP请求时&#xff0c;有时候可能会遇到请求超时的情况。为了解决这个问题&#xff0c;你可以考虑以下几个方面&#xff1a; 设置脚本的最大执行时间&#xff1a; 在PHP中&#xff0c;可以使用set_time_limit函数来设置脚本的最大执行时间。该函数接受一个以秒为单位的整…

串口发送控制命令,实现一些外设LED 风扇 马达

main.c #include "uart4.h"int main(){char a;char buf[128];uart4_config();while (1){/* //接收一个字符数据agetchar();//发送接收的字符1putchar(a1);putchar(\r);putchar(\n); */gets(buf); // 读取字符串//puts(buf); // 输出字符串if(strcmp(buf,"l…

linux无法访问共享目录,ls hgfs失败

刚在新买的华为电脑上安装ubuntu20&#xff0c;共享文件出现各种问题&#xff1a; dlubuntu:/mnt$ ls ls: cannot access hgfs: Permission denied hgfs 解决方法&#xff1a; 1.首先输入vmware-hgfsclient&#xff0c;看看是否共享文件夹已经建立&#xff0c;没有的话去参考…

在Vue3中使用qrcode库实现二维码生成

本文主要介绍在Vue3中使用qrcode库实现二维码生成的方法。 目录 一、基础用法实现二、toDataURL()方法三、toCanvas()方法四、create()方法五、QRCodeRenderersOptions()方法 在Vue3中实现二维码生成需要使用第三方库来处理生成二维码的逻辑。常用的库有 qrcode和 vue-qrcode…

支付平台在选择服务器租用时要注意什么?

如果要建设一个支付平台的话要进行服务器租用&#xff0c;一旦涉及到钱的方面就必须要顾虑到多方面&#xff0c;这样才能保证安全性&#xff0c;今天小编就给大家讲一讲要注意什么呢&#xff1f; 1、带宽:带宽是业务稳定性的直接因素&#xff0c;只有带宽充足&#xff0c;这样…

kafka发送大消息

1 kafka消息压缩 kafka关于消息压缩的定义&#xff08;来源于官网&#xff09;&#xff1a; 此为 Kafka 中端到端的块压缩功能。如果启用&#xff0c;数据将由 producer 压缩&#xff0c;以压缩格式写入服务器&#xff0c;并由 consumer 解压缩。压缩将提高 consumer 的吞吐量…

使用 pytest.ini 文件控制输出 log 日志

一、前置说明 pytest.ini 文件中可以配置参数来控制 pytest 的运行行为,其存放路径要求与 conftest.py 一样。 项目根目录project_root/ ├── pytest.ini ├── tests/ │ └── test_demo.py以test开头的测试子目录project_root/ ├── tests/ │ ├── pytest.in…

c# OpenCvSharp透视矫正六步实现透视矫正(八)

透视矫正,引用文档拍照扫描&#xff0c;相片矫正这块。 读取图像Cv2.ImRead();预处理&#xff08;灰度化&#xff0c;高斯滤波、边缘检测&#xff09;轮廓检测&#xff08;获取到最大轮廓&#xff09;获取最大面积轮廓的四个顶点标识最小矩形坐标透视矫正显示 完整代码 // 1、…

Linux系统安装及管理

目录 一、Linux应用程序基础 1.1应用程序与系统命令的关系 1.2典型应用程序的目录结构 1.3常见的软件包装类型 二、RPM软件包管理 1.RPM是什么&#xff1f; 2.RPM命令的格式 2,1查看已安装的软件包格式 2.2查看未安装的软件包 3.RPM安装包从哪里来&#xff1f; 4.挂…

web前端项目-七彩夜空烟花【附源码】

web前端项目-七彩动态夜空烟花【附源码】 本项目仅使用了HTML&#xff0c;代码简单&#xff0c;实现效果绚丽&#xff0c;且本项目代码直接运行即可实现&#xff0c;无需图片素材&#xff0c;接下来让我们一起实现一场美丽的烟花秀叭 运行效果&#xff1a;鼠标点击和移动可控制…

理解SpringMVC的工作流程

组件 前置控制器 DispatcherServlet。 映射控制器 HandlerMapping。 处理器 Controller。 模型和视图 ModelAndView。 视图解析器 ViewResolver。 工作流程 spring mvc 先将请求发送给 DispatcherServlet。 DispatcherServlet 查询一个或多个 HandlerMapping&#xff0c;找到…