最近做项目有个功能是需要统计各服务器使用情况,因此写一个方法并计算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
分享到:
相关推荐
这里,我们将深度解析这个主题,探讨在Java环境下构建游戏服务器的关键知识点。 首先,我们需要理解Java语言的优势。Java以其跨平台的特性、丰富的类库以及强大的性能,成为了后端开发的首选语言之一,尤其适合大型...
《深度解析Java游戏服务器开发源代码》是一本专注于Java技术在游戏服务器开发领域的专著,旨在帮助读者深入了解和掌握如何利用Java语言构建高效、稳定的游戏服务端系统。书中的源代码提供了丰富的实践示例,涵盖了从...
Java作为广泛使用的编程语言,提供了强大的正则表达式支持,使得我们能够有效地解析和处理日志文件。本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作...
4. **处理响应**:当从服务器收到数据后,Java程序需要解析这些响应,通常是以字节流的形式。VxIPMI库会提供帮助类和方法来解析这些数据,将其转换为可读的格式,如摄氏度、转/分钟等。 5. **内存信息获取**:除了...
在Java开发中,实时日志解析处理是一项至关重要的任务,特别是在大规模分布式系统或者高并发环境中。日志是系统运行状态的记录,对于故障排查、性能优化、安全监控等都有着不可替代的作用。本篇将深入探讨Java如何...
标题 "java 读取Ftp指定位置的文件解析并入库" 涉及到的是使用Java编程语言通过FTP(File Transfer Protocol)协议从远程服务器上下载文件,然后对下载的文件进行解析,并将解析得到的数据存储到数据库中。...
Java应用服务器Tomcat是Java开发领域中不可或缺的一部分,它是一个开源、轻量级的Web应用服务器,主要用于运行基于Java Servlet和JavaServer Pages(JSP)技术的Web应用程序。由Apache软件基金会开发并维护,Tomcat...
因此,掌握如何使用Java解析XML是非常必要的技能。本文将详细介绍Java中四种常用的XML解析技术:SAX、DOM、StAX以及JAXB,并对它们的特点、适用场景进行对比分析。 ### 1. SAX 解析器 #### 1.1 定义 SAX(Simple ...
在这个服务器源码中,可能有一个或多个Servlet类,负责解析请求、执行数据库操作,并将结果返回给客户端。 安全性方面,考虑到涉及个人信息的传输,服务器可能应用了HTTPS协议来加密通信,确保数据的隐私。HTTPS是...
这个压缩包提供的是一些用于Java解析和操作JSON的库,包括json-lib-2.4-jdk15.jar,这是一个常用的JSON库,它为Java提供了方便的JSON解析和生成功能。 json-lib-2.4-jdk15.jar是主要的JSON处理库,它支持多种Java...
总之,这个Java代理服务器程序涵盖了网络编程、HTTP协议解析、并发处理、缓存策略、安全通信和日志记录等多个方面,对深入理解这些Java技术以及网络原理有着极大的学习价值。通过研究这个项目,开发者可以提升自己在...
5. **日志和错误处理**:记录请求和响应的日志可以帮助调试和分析服务器的行为。同时,良好的错误处理机制可以确保在出现问题时优雅地处理,例如使用`try-catch-finally`结构来捕获和处理异常。 6. **代理服务器...
标题提到的是“java解析json格式字符串所需jar包”,描述指出我们可以自行下载这些库。在提供的压缩包文件中,包含了以下几个关键的jar包: 1. **commons-collections-3.2.1.jar**:这是Apache Commons Collections...
Java开源邮件服务器Apache James是基于Java技术构建的一款强大的邮件服务器软件。它的源代码开放,允许开发者深入了解其工作原理,并可根据需求进行定制化开发。Apache James 2.3.2是该项目的某个稳定版本,提供了...
4. **请求解析**:服务器需要解析接收到的HTTP请求,提取出请求行(包括方法、URL和协议版本)、请求头和请求体。 5. **响应构造**:根据请求,服务器需要构造HTTP响应,包括状态码、响应头和响应体。响应体通常是...
在日志处理系统中,Kafka可以与其他工具如Logstash或Flume集成,进行日志数据的清洗、解析和结构化。之后,这些预处理的日志数据可以被送入MySQL数据库进行持久化存储。MySQL是一种广泛使用的开源关系型数据库管理...
### Java代理服务器的实现 #### 概述 Java代理服务器是一种网络中间件,它作为客户端与目标服务器之间的中介,能够帮助转发HTTP请求和响应。在实际应用中,代理服务器不仅能够提升安全性,还能够用于缓存、日志...
【Java HTTP服务器TJWS源码】是一款基于Java语言实现的轻量级HTTP服务器,它提供了基础的HTTP服务功能,适合学习和理解网络编程以及Java服务器端开发。TJWS,全称为Tiny Java Web Server,因其小巧且易于理解的源码...
本文将深入探讨如何使用Java语言搭建一个简单的Web服务器,以及这个过程中的关键知识点。 首先,我们要理解Web服务器的基本概念。Web服务器是一种软件,它接收HTTP(超文本传输协议)请求并返回HTML页面或其他Web...