百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

分析日志大文件统计ip和url(日志文件的块数)

toyiye 2024-07-15 01:38 9 浏览 0 评论

#挑战30天在头条写日记#

背景

某天,网站响应速度超级慢,页面加载数据要等好几秒,业务员一直向我们技术反馈,经查找,发现有程序在频繁的访问我们的接口,也就是爬虫在抓取我们的数据,那我们就需要找到频繁访问的ip,服务器限制此ip访问。那么就需要在日志文件中找到此ip,下边是我写的简单代码,供大家参考。

代码

public class AnalyseLog {
public static final long OVERSIZE = 10485760;//文件限定大小10M,如果超出这个大小进行分片
public static final String SUFFIX = ".txt";//小文件后缀名
public static final String TEMPFILENAME = "zoneTemp";//临时文件夹名
public static final boolean ISSTARTZONE = false;//是否开启分片,默认为关
@Test
public void analyseLogUtils() {
DateTime start = DateTime.now();
//获取文件
String filePath = "D:\\estzone\\localhost_access_log.2020-10-16.txt";
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
BufferedWriter bw = null;
long zoneNum = 0;//分片数量
List<File> zoneList = new ArrayList<>();//分片结果集
File file = new File(filePath);
if(!file.exists()||file.isDirectory()){
System.out.println("文件不存在或不是文件");
return;
}
//获取父文件路径
String parentPath = file.getParentFile().getAbsolutePath();
//文件大小
long length = file.length();
if(ISSTARTZONE){
if(length>OVERSIZE){
//计算分片数量
zoneNum = length%OVERSIZE ==0?length/OVERSIZE:length/OVERSIZE+1;
}
if(zoneNum==0){
zoneList.add(file);
}else{
List<File> files = AnalyseLog.zoneFile(file);
zoneList.addAll(files);
}
}else{
zoneList.add(file);
}
Map<String, Long> ipMap = new HashMap<>();//统计ip个数
Map<String, Long> urlMap = new HashMap<>();//统计url个数
Map<String,List<String>> ipUrlConRelate = new HashMap<>();//ip与地址关联
//循环读取分片
for (File temp : zoneList) {
try {
fis = new FileInputStream(temp);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
while (br.readLine()!=null){
String zoneStrLine = br.readLine();
if(StringUtils.isNotBlank(zoneStrLine)){
String ipRegex = "((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))";
String urlRegex = "\\s(/[\\w-./?%&=]*)?";
Map<String, Long> ipTempMap = AnalyseLog.regexTextNum(zoneStrLine, ipRegex);
//ip
String ip = "";
if(!ipTempMap.isEmpty()){
ip = (String) ipTempMap.keySet().toArray()[0];
for (Map.Entry<String, Long> ipEntry : ipTempMap.entrySet()) {
String key = ipEntry.getKey();
Long value = ipEntry.getValue();
if(ipMap.containsKey(key)){
Long aLong = ipMap.get(key);
ipMap.put(key,aLong+value);
}else{
ipMap.put(key,value);
}
}
}
//url
Map<String, Long> urlTempMap = AnalyseLog.regexTextNum(zoneStrLine, urlRegex);
String url ="";
if(!urlTempMap.isEmpty()){
url = (String) urlTempMap.keySet().toArray()[0];
for (Map.Entry<String, Long> urlEntry : urlTempMap.entrySet()) {
String key = urlEntry.getKey();
Long value = urlEntry.getValue();
if(urlMap.containsKey(key)){
Long aLong = urlMap.get(key);
urlMap.put(key,aLong+value);
}else{
urlMap.put(key,value);
}
}
}
//关联ip和url
if(StringUtils.isNotBlank(ip) && StringUtils.isNotBlank(url)){
if(ipUrlConRelate.containsKey(ip)){
List<String> stringList = ipUrlConRelate.get(ip);
if(!stringList.contains(url)){
stringList.add(url);
}
}else{
List<String> urlTemp = new ArrayList<>();
urlTemp.add(url);
ipUrlConRelate.put(ip,urlTemp);
}
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fis.close();
isr.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//生成poi报表
XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
XSSFSheet ipSheet = xssfWorkbook.createSheet("ip统计");
ipSheet.setDefaultColumnWidth(15);
int k = 0;
for (Map.Entry<String, Long> stringLongEntry : ipMap.entrySet()) {
XSSFRow row = ipSheet.createRow(k);
row.createCell(0).setCellValue(stringLongEntry.getKey());
row.createCell(1).setCellValue(stringLongEntry.getValue());
k++;
}
XSSFSheet urlSheet = xssfWorkbook.createSheet("url统计");
urlSheet.setDefaultColumnWidth(15);
k =0;
for (Map.Entry<String, Long> stringLongEntry : urlMap.entrySet()) {
XSSFRow row = urlSheet.createRow(k);
row.createCell(0).setCellValue(stringLongEntry.getKey());
row.createCell(1).setCellValue(stringLongEntry.getValue());
k++;
}
k = 0;
XSSFSheet ipurlSheet = xssfWorkbook.createSheet("ip-url统计");
ipurlSheet.setDefaultColumnWidth(15);
for (Map.Entry<String, List<String>> stringListEntry : ipUrlConRelate.entrySet()) {
XSSFRow row = ipurlSheet.createRow(k);
List<String> value = stringListEntry.getValue();
for (int j = 0; j < value.size(); j++) {
String s = value.get(j);
if(j == 0){
row.createCell(0).setCellValue(stringListEntry.getKey());
row.createCell(1).setCellValue(s);
}else{
XSSFRow rowSecond = ipurlSheet.createRow(k);
rowSecond.createCell(1).setCellValue(s);
}
k++;
}
k = k-1;
k++;
}
String path = FileSystemView.getFileSystemView().getHomeDirectory().getPath();
File resultFile = new File(path, "analyse.xlsx");
try {
xssfWorkbook.write(new FileOutputStream(resultFile));
} catch (IOException e) {
e.printStackTrace();
}
if(zoneNum!=0){
//删除临时文件
File tempFile = new File(file.getParentFile().getPath() + "/" + TEMPFILENAME);
String tempFilePath = tempFile.getPath();
String dosDelOrder = "cmd /c rd "+tempFilePath+" /s/q";
String linuxDelOrder = "sh -c rm -rf "+tempFilePath;
Runtime runtime = Runtime.getRuntime();
try {
Process exec = runtime.exec(dosDelOrder);
exec.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
DateTime end = DateTime.now();
System.out.println("耗时:"+(end.getMillis()- start.getMillis())/1000+"秒");
}
/**
* 查询出文本中的ip和接口
* create by ly on 2020/10/16
* @Param [context]
* @return java.util.Map<java.lang.String,java.lang.Long>
*/
public static Map<String,Long> regexTextNum(String context, String Regex){
Pattern compile = Pattern.compile(Regex);
Matcher matcher = compile.matcher(context);
Map<String,Long> result = new HashMap<>();
while(matcher.find()){
if(StringUtils.isNotBlank(matcher.group())){
String group = matcher.group();
if(result.containsKey(group)){
result.put(group,result.get(group)+1);
}else{
result.put(group,1L);
}
}
}
return result;
}
/**
* 文件分片
* create by ly on 2020/10/19
* @Param [file]
* @return java.util.List<java.io.File>
*/
public static List<File> zoneFile(File file){
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
BufferedWriter bw = null;
StringBuffer stringBuffer = new StringBuffer();
List<File> zoneList = new ArrayList<>();//分片结果集
//进行分片
try {
fis = new FileInputStream(file);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
String lineStr=null;//保证读取每一行
while((lineStr=br.readLine())!=null){
//(lineStr=br.readLine())!=null&&(lineStr=br.readLine())!=""这样写会导致读取两行
//按行读取
stringBuffer.append(lineStr).append("\n");
//查看读取量
if(stringBuffer.length()>OVERSIZE){
//超出限定,生成分片
//指定父文件下临时小文件
File tempFile = new File(file.getParentFile().getPath() + "/" + TEMPFILENAME);
tempFile.mkdirs();
File zoneFile = File.createTempFile("tomcat_log_zone_chapter",SUFFIX,tempFile);
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(zoneFile)));
bw.write(stringBuffer.toString());
zoneList.add(zoneFile);
bw.close();
//清空stringbuffer
stringBuffer.delete(0,stringBuffer.length());
}
lineStr="";
}
if(stringBuffer.length()!=0){
//指定父文件下临时小文件
File tempFile = new File(file.getParentFile().getPath() + "/" + TEMPFILENAME);
tempFile.mkdirs();
File zoneFile = File.createTempFile("tomcat_log_zone_chapter",SUFFIX,tempFile);
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(zoneFile)));
bw.write(stringBuffer.toString());
zoneList.add(zoneFile);
bw.close();
//清空stringbuffer
stringBuffer.delete(0,stringBuffer.length());
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
fis.close();
isr.close();
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return zoneList;
}
}

用java来分析大文件,效率可能完全不如python,如果对分析数据有很大的需求,建议使用python.

你的赞和关注是对我最大的肯定,希望大家多多支持,谢谢大家。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码