首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JAVA解析服务器日记

2012-08-26 
JAVA解析服务器日志????? 最近做项目有个功能是需要统计各服务器使用情况,因此写一个方法并计算Used值(本

JAVA解析服务器日志

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

JAVA解析服务器日记

?

????? 其核心代码就是,解析服务器日志的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);
?}

}

?

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

热点排行