redis日志分析

article/2025/8/20 23:41:42

首先复习一下IO流:

关于读取文件:

  • BufferedReader

从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取

  • InputStreamReader

字节流通向字符流的桥梁 以UTF-8编码读取

  • FileInputStream

从文件系统中的某个文件中获取输入字节

这三个通常一起使用:

BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(new File(path))));

终的意思是:从path指定的路径中的文件以UFT-8解码,最终生成BufferedReader 对象,读取文件内容

之前在万年历的时候讲解了Calendar类,这里补充一下Java Date类:

在 Java 中获取当前时间,可以使用 java.util.Date 类和 java.util.Calendar 类完成。其中,Date 类主要封装了系统的日期和时间的信息,Calendar 类则会根据系统的日历来解释 Date 对象

Date 类

Date 类表示系统特定的时间戳,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。

1. 构造方法

Date 类有如下两个构造方法。

Date date1 = new Date();    // 调用无参数构造函数
System.out.println(date1.toString());    // 输出:Wed May 18 21:24:40 CST 2016
Date date2 = new Date(60000);    // 调用含有一个long类型参数的构造函数
System.out.println(date2);    // 输出:Thu Jan 0108:01:00 CST 1970

2. 常用方法:

请添加图片描述

举个例子:假设,某一天特定时间要去做一件事,而且那个时间已经过去一分钟之后才想起来这件事还没有办,这时系统将会提示已经过去了多 长时间。具体的代码如下:

import java.util.Date;
import java.util.Scanner;
public class Test11 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("请输入要做的事情:");String title = input.next();Date date1 = new Date(); // 获取当前日期System.out.println("[" + title + "] 这件事发生时间为:" + date1);try {Thread.sleep(60000);// 暂停 1 分钟} catch (InterruptedException e) {e.printStackTrace();}Date date2 = new Date();System.out.println("现在时间为:" + date2);if (date2.before(date1)) {System.out.println("你还有 " + (date2.getTime() - date1.getTime()) / 1000 + " 秒需要去完成【" + title + "】这件事!");} else {System.out.println("【" + title + "】事情已经过去了 " + (date2.getTime() - date1.getTime()) / 1000 + " 秒");}}
}

在该程序中,分别使用 Date 类的无参数构造方法创建了两个 Date 对象。在创建完第一个 Date 对象后,使用 Thread.sleep() 方法让程序休眠 60 秒,然后再创建第二个 Date 对象,这样第二个 Date 对象所表示的时间将会在第一个 Date 对象所表示时间之后,因此“date2.before(date1)”条件表达式不成立,从而执行 else 块中的代码,表示事情已经发生过。

请输入要做的事情:
收快递
【收快递】这件事发生时间为:Fri Oct 12 11:11:07 CST 2018
现在时间为:Fri Oct 12 11:12:07 CST 2018
【收快递】事情已经过去了 60

顺带再次回顾一下Calendar 类:

Calendar 类是一个抽象类,它为特定瞬间与 YEAR、MONTH、DAY_OF—MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期) 提供了一些方法。

创建 Calendar 对象不能使用 new 关键字,因为 Calendar 类是一个抽象类,但是它提供了一个 getInstance() 方法来获得 Calendar类的对象。getInstance() 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。

Calendar c = Calendar.getInstance();

Calendar类的常用方法:

请添加图片描述

Calendar 对象可以调用 set() 方法将日历翻到任何一个时间,当参数 year 取负数时表示公元前。Calendar 对象调用 get() 方法可以获取有关年、月、日等时间信息,参数 field 的有效值由 Calendar 静态常量指定。

Calendar 类中定义了许多常量,分别表示不同的意义。

例如,要获取当前月份可用如下代码:

int month = Calendar.getInstance().get(Calendar.MONTH);

注意:如果整型变量 month 的值是 0,表示当前日历是在 1 月份;如果值是 11,则表示当前日历在 12 月份。

使用 Calendar 类处理日期时间的实例如下:

Calendar calendar = Calendar.getInstance(); // 如果不设置时间,则默认为当前时间
calendar.setTime(new Date()); // 将系统当前时间赋值给 Calendar 对象
System.out.println("现在时刻:" + calendar.getTime()); // 获取当前时间
int year = calendar.get(Calendar.YEAR); // 获取当前年份
System.out.println("现在是" + year + "年");
int month = calendar.get(Calendar.MONTH) + 1; // 获取当前月份(月份从 0 开始,所以加 1)
System.out.print(month + "月");
int day = calendar.get(Calendar.DATE); // 获取日
System.out.print(day + "日");
int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 获取今天星期几(以星期日为第一天)
System.out.print("星期" + week);
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取当前小时数(24 小时制)
System.out.print(hour + "时");
int minute = calendar.get(Calendar.MINUTE); // 获取当前分钟
System.out.print(minute + "分");
int second = calendar.get(Calendar.SECOND); // 获取当前秒数
System.out.print(second + "秒");
int millisecond = calendar.get(Calendar.MILLISECOND); // 获取毫秒数
System.out.print(millisecond + "毫秒");
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 获取今天是本月第几天
System.out.println("今天是本月的第 " + dayOfMonth + " 天");
int dayOfWeekInMonth = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH); // 获取今天是本月第几周
System.out.println("今天是本月第 " + dayOfWeekInMonth + " 周");
int many = calendar.get(Calendar.DAY_OF_YEAR); // 获取今天是今年第几天
System.out.println("今天是今年第 " + many + " 天");
Calendar c = Calendar.getInstance();
c.set(2012, 8, 8); // 设置年月日,时分秒将默认采用当前值
System.out.println("设置日期为 2012-8-8 后的时间:" + c.getTime()); // 输出时间

打印一个日历:

import java.util.Calendar;
public class CalendarDemo {public static void main(String[] args) {Calendar calendar = Calendar.getInstance();calendar.set(2016, 5, 1); // 实际的calendar对象所表示的日期为2016年6月1日// 判断2016年6月1日为一周中的第几天int index = calendar.get(Calendar.DAY_OF_WEEK) - 1;char[] title = { '日', '一', '二', '三', '四', '五', '六' }; // 存放曰历的头部int daysArray[][] = new int[6][7];// 存放日历的数据int daysInMonth = 31; // 该月的天数int day = 1; // 自动增长for (int i = index; i < 7; i++) {// 填充第一周的日期数据,即日历中的第一行daysArray[0][i] = day++;}for (int i = 1; i < 6; i++) {// 填充其他周的日历数据,控制行for (int j = 0; j < 7; j++) {// 如果当前day表示的是本月最后一天,则停止向数组中继续赋值if (day > daysInMonth) {i = 6;break;}daysArray[i][j] = day++;}}System.out.println("------------------2016 年 6 月--------------------\n");for (int i = 0; i < title.length; i++) {System.out.print(title[i] + "\t");}System.out.print("\n");// 输出二元数组daysArray中的元素for (int i = 0; i < 6; i++) {for (int j = 0; j < 7; j++) {if (daysArray[i][j] == 0) {if (i != 0) {// 如果到月末,则完成显示日历的任务,停止该方法的执行return;}System.out.print("\t");continue;}System.out.print(daysArray[i][j] + "\t");}System.out.print("\n");}}
}

该程序看似复杂其实很简单。因为 Calendar 类所表示的时间月份是 set() 方法中表示月份的参数值 +1,因此 Calendar 类的实际时间为 2016 年 6 月 1 日。在下面的代码中分别获取 6 月 1 日为本周中的第几天,以便在相应的星期下开始输出 6 月份的日历。程序中的 daysArray 是一个二元数组,该二元数组控制了日历的格式输出,第一个子数组控制日历的行,第二个子数组控制曰历的列,即可输出二元数组中的每一个元素。

------------------20166--------------------日 一 二 三 四 五 六1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 

关于Hashmap的参数讲解:

请添加图片描述

习题讲解:

package 任务C__日志分析;import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;/*** @author ${范涛之}* @Description* @create 2021-12-03 10:08*/
public class Test {public static void main(String[] args) throws IOException {List<String> list = new ArrayList<>();                                           //定义集合int savenum = 0;                                                                 //定义存盘次数File file = new File("D:\\C桌面\\CSDN学习计划\\技术训练营\\redis.log");    //定义文件路径/*** 分开写的:*/
//        InputStreamReader inp = new InputStreamReader(new FileInputStream(file),"utf-8");
//        BufferedReader reader = new BufferedReader(inp);/*** 合起来写:*/BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(String.valueOf(file)))));/*** 存取文件到list集合中:*/while (reader.read() != -1) {list.add(reader.readLine());}/*** 统计存盘次数,以数组中出现关键字“DB saved on disk”为基准*/List<String> savedCountList = list.stream().filter(n -> n.contains("DB saved on disk")).collect(Collectors.toList());for (String x : savedCountList) {savenum++;}// 输出存储数据的次数System.out.println("存盘次数为:" + savenum);/*** 统计出最小存盘时间和最大存盘时间*///开始存储时间的数组。List<String> saveStartTimeList = timeList(list, "Background saving started by pid");//调用 toDate 方法,把字符串列表转化为 Date 列表List<Date> saveStartTimeDateList = toDate(saveStartTimeList);//完成存储时间的数组。List<String> saveEndTimeList = timeList(list, "DB saved on disk");//调用 toDate 方法,把字符串列表转化为时间列表List<Date> saveEndTimeDateList = toDate(saveEndTimeList);//存储消耗时间的数组List<Long> saveSpentTimeList = new ArrayList<>();/*** 通过结束时间减去开始时间算出时间差*/for (int i =0;i<saveStartTimeList.size();i++){saveSpentTimeList.add(saveEndTimeDateList.get(i).getTime()-saveStartTimeDateList.get(i).getTime());}long maxSaveTime = saveSpentTimeList.get(0);long minSaveTime = saveSpentTimeList.get(0);/*** 在获取的时间查里面筛选处最大和最小的*/for (int i = 0; i < saveSpentTimeList.size(); i++) {if (saveSpentTimeList.get(i) < minSaveTime) {minSaveTime = saveSpentTimeList.get(i);} else if (saveSpentTimeList.get(i) > maxSaveTime) {maxSaveTime = saveSpentTimeList.get(i);}}//输出最大、最小存储时间System.out.println("最大存储时间为:" + maxSaveTime + "毫秒");System.out.println("最小存储时间为:" + minSaveTime + "毫秒");//统计 * 号后出现的单词HashMap<String,Integer> wordMap = new HashMap<>(100);for (String str:list){String[] arr = str.split(" ");for (int i = 4; i <arr.length; i++) {// 首先判断是否是数字:if (!isNumeric(arr[i])){// 判断集合中有没有这个单词,没有的话就加上,次数加一if (!wordMap.containsKey(arr[i])){wordMap.put(arr[i],1);}else  if (wordMap.containsKey(arr[i])){Integer count = wordMap.get(arr[i]);wordMap.replace(arr[i],count+1);}}}}//对 wordMap 中的数据排序List<Map.Entry<String, Integer>> sortedWordMap = new ArrayList<Map.Entry<String, Integer>>(wordMap.entrySet());//输出 * 后出现的单词,及其次数System.out.println("单词出现的次数为(降序排列):");for (Map.Entry<String, Integer> entry : sortedWordMap) {System.out.println(entry.getKey() + ":" + entry.getValue() + " 次");}//统计 pidHashMap<String, Integer> pidMap = new HashMap<>(100);List<String> pidList = list.stream().filter(s -> s.contains("pid")).collect(Collectors.toList());for (String str : pidList) {String[] arr = str.split(" ");//因为 pid 在日志中是第 10 个,因此索引为 9//如果集合中没有该 pid,则添加,并且次数记为 1。if (!pidMap.containsKey(arr[9])) {pidMap.put(arr[9], 1);}//如果集合中有该 pid,则将其次数 +1。else if (pidMap.containsKey(arr[9])) {Integer count = pidMap.get(arr[9]);pidMap.replace(arr[9], count + 1);}}//筛选 pidMap 中 value 大于 1 的数据Collection<Integer> values = pidMap.values();while (values.contains(1)) {values.remove(1);}List<Map.Entry<String, Integer>> repeatedPidMap = new ArrayList<Map.Entry<String, Integer>>(pidMap.entrySet());//输出重复出现的pidSystem.out.println("重复出现的pid有:");for (Map.Entry<String, Integer> entry : repeatedPidMap) {System.out.println(entry.getKey() + ":" + entry.getValue() + " 次");}}/*** 会用到的方法:*///获取时间数组的方法,传入参数为list列表和关键字public static List<String> timeList(List<String> list, String keyword) {List<String> TimeList = new ArrayList<>();list.stream().filter(s -> s.contains(keyword)).forEach(s -> {s = (s.split(" ")[1] + " " + s.split(" ")[2]);TimeList.add(s);});return TimeList;}// toDate方法:public static List<Date> toDate(List<String> stringList) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");List<Date> dateList = new ArrayList<>();for (String s : stringList) {try {Date d = sdf.parse(s);dateList.add(d);} catch (ParseException e) {e.printStackTrace();}}return dateList;}//判断字符串是否为数字的方法public static boolean isNumeric(String str) {return str.chars().allMatch(Character::isDigit);}}

结果截图:

请添加图片描述


http://chatgpt.dhexx.cn/article/dW6svmw8.shtml

相关文章

【日志分析】Web日志分析

ox01 Web日志 Web访问日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对WEB日志进行的安全分析&#xff0c;不仅可以帮助我们定位攻击者&#xff0c;还可以帮助我们还原攻击路径&#xff0c;找到网站存在的安全漏洞并进行修复。 我们来看一条Apache的访问日…

日志分析方法概述

注&#xff1a;写得有点乱&#xff0c;但目前市面上这方面内容的确不多&#xff0c;mark一下~ http://blog.csdn.net/pkueecser/article/details/9569251 大数据应用--系统监控与日志分析 http://wenku.baidu.com/link?url8CJ-URMjVTVaw3GM1AZ2w9A7V0CIeRz3dx7xvysILLk6IdW…

日志分析软件

来源&#xff1a;http://onlyktt.blog.hexun.com/32563117_d.html 在经营管理亿枝客过程中&#xff0c;就遇到了非常多的困难。所以不断的学习知名与不知名互联网创业前辈留下来的经验特别重要&#xff0c;特别是上次与ZAC厦门交流后&#xff0c;以及拜读他写的《网络营销实践密…

简单的Web日志分析

Web日志分析 以apache为例 访问日志记录过程 apache日志大致分为两类&#xff1a;访问日志和错误日志 访问日志记录的过程&#xff1a; 客户端向web服务器发送请求&#xff0c;请求中包含客户端的IP、浏览器类型(User-Agent)、请示的URL等信息 web服务器向客户端返回请示的…

Window日志分析

0x01 Window事件日志简介 Windows系统日志是记录系统中硬件、软件和系统问题的信息&#xff0c;同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因&#xff0c;或者寻找受到攻击时攻击者留下的痕迹。 Windows主要有以下三类日志记录系统事件&#xff1a;应…

LOG日志详解

欢迎关注作者博客 简书传送门 文章目录 Log的用途记录Log的基本原则日志的级别划分日志对性能的影响什么时候输出日志系统启动参数、环境变量异常捕获处函数获得期望之外的结果时关键操作 日志输出的内容什么时候使用J2SE自带的日志 典型问题分析该用日志的地方不用啰嗦重复、没…

日志管理与分析

ISBN: 978-7-121-40632-4 编著&#xff1a;日志易学院 页数&#xff1a;198页 阅读时间&#xff1a;2022-09-25 推荐指数&#xff1a;★★★★☆ 本书是国产日志易团队按照主流的日志管理系统的实践来写的&#xff0c; 讲解了日志分析的基本概念、法律法规、技术选型、采集和解…

Linux日志分析

文章目录 一、系统日志介绍二、rsyslog管理三、实践1.将ssh服务日志单独存放2.远程日志3.排错 一、系统日志介绍 无论你的操作系统是 Windows 还是 Linux &#xff0c;只要使用操作系统&#xff0c;就都会产生日志。日志可以说记录了你在PC上的一切操作。就像小时候写的日记。…

日志分析方法

日志分析方法 日志分析方法分析方法&#xff1a; 1.特征字符分析&#xff08;Signature-based&#xff09;&#xff1a;2.访问频率分析&#xff08;Frequency analysis&#xff09; 1.漏洞扫描检测:2.暴力破解检测:3.webshell 检测 难点&#xff1a;风险评估模型&#xff1a;参…

【日志分析】Window日志分析

0x01 Window事件日志简介 Windows系统日志是记录系统中硬件、软件和系统问题的信息&#xff0c;同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因&#xff0c;或者寻找受到攻击时攻击者留下的痕迹。 Windows主要有以下三类日志记录系统事件&#xff1a;应…

日志分析篇---Web日志分析

日志分析篇—Web日志分析 文章目录 日志分析篇---Web日志分析一、 web日志二、日志分析技巧三、日志分析案例1、定位攻击源2、搜索相关日志记录3、对找到的访问日志进行解读&#xff0c;攻击者大致的访问路径如下&#xff1a; 四、日志统计分析技巧五、我的公众号 一、 web日志…

日志文件分析

文章目录 日志的功能日志文件的分类主要日志文件介绍内核以及系统日志日志记录的一般格式程序日志分析日志管理策略配置日志服务器收集日志journalctl日志管理工具 日志文件 日志的功能 &#xff1a; 用于记录系统、程序运行中发生的各种事件 通过阅读日志&#xff0c;有助于…

Windows安全日志分析

Windows安全日志分析 0x00 引言 在应急响应初步阶段&#xff0c;我们会对系统日志、中间件安全日志、恶意文件等进行收集。接下来便是要进一步对这些文件进行分析&#xff1a;对恶意文件逆向、日志文件分析、梳理入侵时间线和入侵路径等。本文主要对Windows安全日志进行举例分…

分析日志的流程

Web日志分析常见方法工具 1.编码 某web日志 URL 编码 BASE64编码 16进制编码&#xff08;以\x开头&#xff09; utf-8编码 字符集 Unicode&#xff08;以\u、\u、&#x、&#开头&#xff09;&#xff0c;gb2312&#xff0c;gbk 2.利用解码工具 http://www.mxcz.net/too…

spooling技术和通道及实现打印机共享

spooling技术的作用&#xff1a; 1、spooling技术的引入是为了 缓和高速CPU和低速I/O设备之间的矛盾 &#xff1b; 2、spooling技术能够允许多台外部设备进行联机并发操作&#xff0c; 实现虚拟性 &#xff1b; 在这个技术中用到了缓冲区和通道&#xff0c;缓冲区大家都…

假脱机技术Spooling和守护进程

文章目录 假脱机系统Spooling和守护进程1.假脱机技术的引入2.SPOOling系统的组成3.SPOOling系统的工作过程守护进程 假脱机系统Spooling和守护进程 1.假脱机技术的引入 脱机技术&#xff1a; 为了缓和CPU的高速性与IO设备的低速性间的矛盾&#xff0c;而引入了脱机输入&#…

【操作系统】SPOOLing技术(外部设备联机并行操作/假脱机技术)

SPOOling技术便可将一台物理I/O设备虚拟为多台逻辑I/O设备&#xff0c;同样允许多个用户共享一台物理I/O设备&#xff08;生活中最常见的就是多台电脑共享同一个打印机&#xff09; 目的&#xff1a;为了缓和CPU的高速性与I/O设备低速性之间的矛盾而引入了脱机输入/输出技术。…

操作系统~假脱机SPOOLing技术与缓冲区管理

文章目录 什么是脱机技术假脱机技术—―输入/输出缓冲区共享打印机的实现原理缓冲区的管理缓冲区的工作过程单缓冲双缓冲循环缓冲区缓冲池 什么是脱机技术 在传统的批处理操作系统中, 我们将输入数据统一写到磁带中, 又将输出数据统一写到磁带中, 这就是一种脱机技术 Tips:为…

实验四 模拟SPOOLING技术

实验目的 通过设计一个SPOOLING假脱机输出的模拟程序&#xff0c;更好地理解和掌握SPOOLING假脱机技术.。 实验内容 1.设计一个实现SPOOLING技术的进程 设计一个SPOOLING输出进程和两个请求输出的用户进程。 当用户需要输出时&#xff0c;调用请求输出进程&#xff0c;将需…

输入输出管理:假脱机技术(SPOOLING)

假脱机技术 假脱机技术&#xff08;SPOOLING&#xff09;1.1 脱机技术1.2 假脱机技术1.3 假脱机技术的应用1.4 假脱机技术和缓冲的区别 假脱机技术&#xff08;SPOOLING&#xff09; 下图来自程序员cxuan IO软件层次结构 1.1 脱机技术 脱机处理是一种计算机技术&#xff0c;是…