最近做项目有个功能是需要统计各服务器使用情况,因此写一个方法并计算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);
}
}
结束语:这段代码,我在无聊的时候进行了一次修改,使其各方法更简单明了,便于理解的方式展现给大家,当然也有些不足之处,就留作大家自己修改完善,希望对初学者和大家有所帮助。