`
HogwartsRow
  • 浏览: 58006 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA解析服务器日志

阅读更多

      最近做项目有个功能是需要统计各服务器使用情况,因此写一个方法并计算Used值(本文仅统计了以“G”结尾的Used的值),服务器日志内容如图所示:

 

      其核心代码就是,解析服务器日志的java类--AnalysisLog.java,代码如下:

 

package com.fz.cloudsync.business.sns;

 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;


import java.util.Arrays;
import java.util.Date;
import java.util.List;

import com.funambol.util.TimeUtil;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;

 

public class AnalysisLog {

 

 private Logger log = LoggerFactory.getLogger(AnalysisLog.class);
 
 public int storageUsed = 0;//定义了一个全局变量,方便其他类直接使用
 
 //解析日志
 public List<String> parserLog(String dir){


  List<String> comList = new ArrayList<String>();


  List<String> fileList = getLogFileByScanFolder(dir);


  if(fileList==null){return null;}
  
  for (int i = 0; i < fileList.size(); i++) {


   String log_file = fileList.get(i);
   boolean isFlag = checkLogTime(log_file);


   if (isFlag) {

    File file = new File(log_file);
    try {
     List<String> logList = new ArrayList<String>();// 存储日志内容


     FileReader fr = new FileReader(file);
     BufferedReader br = new BufferedReader(fr);

     String line = null;
     while ((line = br.readLine()) != null) {
      logList.add(line);
     }

 

     for (int j = 0; j < logList.size(); j++) {


      if (j == 0) {
       logList.remove(0);
      }


      for (int k = 0; k < logList.size(); k++) {
       if (j == k) {
        String log_data = logList.get(k);
        String usedVlaue = appointField(log_data);// Used值
        if (usedVlaue.endsWith("G")) {
         comList.add(usedVlaue);
        }
       }
      }
     }
     br.close();
     fr.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
  
  countUsedValue(comList);// 调用readLogData()并计算Used值
  
  return comList;
 }
 
 //计算Used的使用值
 public void countUsedValue(List<String> comList){
  List<String> usedList = new ArrayList<String>();
  List<String> dataList = comList;//日志内容
  
  for (int i = 0; i < dataList.size(); i++) {
   String usedGV = dataList.get(i);
   if(usedGV.endsWith("G")){
    double usedValue = Double.valueOf(usedGV.substring(0, usedGV.lastIndexOf("G")).toString());
    usedList.add(String.valueOf(usedValue));
   }
  }


  double usedVlaue_sum = 0,usedVlaue=0;
  for (int i = 0; i < usedList.size(); i++) {
   usedVlaue = Double.valueOf(usedList.get(i));
   usedVlaue_sum +=usedVlaue;
  }


  int used = Integer.valueOf(String.valueOf(Math.round(usedVlaue_sum)));
  storageUsed = used;
     log.info("disk has used:" + storageUsed + "G");
 }

 

 // 去除空格,获取Used值
 public String appointField(String field) {
  String used = "";
  String[] str = field.split("\\s{1,}");
  for (int i = 0; i < str.length; i++) {
   if (i == 2) {
    used = str[i];//获取Used
   }
  }
  return used;
 }

 

 // 检查前一天日志文件存在与否(日志文件名中有时间段)
 public boolean checkLogTime(String logFile) {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  String yesterday = sdf.format(TimeUtil.getBefore(new Date(), 1));
  String vorgestern  = sdf.format(TimeUtil.getBefore(TimeUtil.getDateOfStart(new Date()), 2));
  
  String[] str = logFile.split("_");
  String logtime = "";// 日志时间戳
  for (int i = 0; i < str.length; i++) {
   if(i==1){
    logtime = str[i];
   }
  }
  if(yesterday.equals(logtime)){
   return true;
  }


  //删除前天或以前的日志文件
  if(vorgestern.compareTo(logtime)>=0){
   deleteLogFile(logFile);//调用deleteLogFile()方法删除日志
  }
  
  return false;
 }
 
 //检查文件夹存在与否
 public boolean checkFolderIsExists(String dir){
  File folder = new File(dir);
  if (folder.getParentFile() == null) {
   log.info("ParentFile is not exists!");
   return false;
  }else{
   if(!folder.getParentFile().exists()){
    folder.getParentFile().mkdir();
    checkFolderIsExists(dir);
    return true;
   }else{
    folder.mkdir();
    return true;
   }
  }
 }
 
 //扫描文件夹获取日志文件
 public List<String> getLogFileByScanFolder(String dir){
  List<String> fileList = new ArrayList<String>();
  boolean isFlag = checkFolderIsExists(dir);
   if(isFlag==true){
    File file = new File(dir);
    if (file.isDirectory()) {// 是不是目录
     String[] files = file.list();// 返回该目录下所有文件及文件夹数组
     if(files.length>0){
      Arrays.sort(files); // 排序
      for (int i = 0; i < files.length; i++) {
       String log_file = files[i];
       if (log_file.endsWith(".log")) {
        String log_path = dir + "/" + log_file;
        fileList.add(log_path);
       }
      }
     }else{
      log.info("Server Log File is not exists!");
      return null;
     }
    }
   }
  return fileList;
 }

 

 //删除日志文件
 public void deleteLogFile(String delpath){
  try {
   File file = new File(delpath);
   if (!file.isDirectory()) {
    file.delete();
   } else if (file.isDirectory()) {
    String[] filelist = file.list();
    for (int i = 0; i < filelist.length; i++) {
     File delfile = new File(delpath + "\\" + filelist[i]);
     if (!delfile.isDirectory()) {
      delfile.delete();
     } else if (delfile.isDirectory()) {
      deleteLogFile(delpath + "\\" + filelist[i]);
     } else {
      file.delete();
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }

 }


 public int getStorageUsed() {
  return storageUsed;
 }

 

 public void setStorageUsed(int storageUsed) {
  this.storageUsed = storageUsed;
 }

 

 public static void main(String[] args){
  // String dir = "D:/opt/tools/diskUse";
  // new AnalysisLog().parserLog(dir);
 }

}

 

      结束语:这段代码,我在无聊的时候进行了一次修改,使其各方法更简单明了,便于理解的方式展现给大家,当然也有些不足之处,就留作大家自己修改完善,希望对初学者和大家有所帮助。

  • 大小: 2.3 KB
0
0
分享到:
评论

相关推荐

    Java NIO原理解析

    Java NIO原理解析jdk供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,但在使用上略显得复杂一些。在NIO中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程...

    parser:重播解析服务器从Dota 2重播文件生成JSON日志事件

    重播解析服务器从重播文件生成日志 快速开始 运行Java项目(它将在端口5600上启动Web服务器) 将.dem重播文件发布到服务器(例如scripts / test.sh中的示例) 解析器在HTTP响应中返回以行分隔的JSON

    JAVA_API1.6文档(中文)

    java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java....

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java开源包11

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包6

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    log-parser-challenge:目标是用Java编写一个解析器,以解析Web服务器访问日志文件,将日志加载到MySQL并检查在给定的持续时间内给定IP发出的请求是否超过一定数量

    目标是用Java编写一个解析器,以解析Web服务器访问日志文件,将该日志加载到MySQL,并检查在给定的持续时间内给定IP发出的请求是否超过一定数量。 Java (1)创建一个Java工具,可以解析给定的日志文件并将其加载到...

    java开源包4

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包9

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包101

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包5

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包8

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包10

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包1

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包3

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    Java思维导图xmind文件+导出图片

    基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 RabbitMQ消息路由机制分析 RabbitMQ消息确认机制 Redis redis数据结构分析 ...

    Java 1.6 API 中文 New

    java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util...

    nginx-log-parser:Nginx 服务器日志分析

    nginx 日志解析器 Nginx 服务器日志分析。

    java开源包2

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

Global site tag (gtag.js) - Google Analytics