본문 바로가기
Java 문제

[Java] 로그 파일을 읽어 트랜젝션ID 별 응답소요시간 구하기

by 두리두리안 2021. 5. 30.

요구 사항 

요청 로그와 응답 로그는 동일한 트랜젝션ID를 갖는다.

각 로그의 라인은 객체로 변환 후 처리 (지난번 과제에서 배웠던 내용) 

처리 시간은 로그의 시간 차로 구한다. (응답 로그의 시간 – 요청 로그의 시간)

응답소요시간을 못구하는 경우 FAIL로 출력

 

로그

1622025201 10001 REQUEST
1622025202 10002 REQUEST
1622025203 10003 REQUEST
1622025211 10003 RESPONSE
1622025212 10002 RESPONSE
1622025213 10001 RESPONSE
1622025221 10004 REQUEST
1622025222 10005 REQUEST

 

LogModelPart

package Version2;

public class LogModelPart {
	private String time;
    private String id;
    private String status;
    
    public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	
	public LogModelPart(String line) throws IllegalAccessError {
        String[] splitOption = line.split(" ");
            this.time = splitOption[0];
            this.id = splitOption[1];
            this.status = splitOption[2];
            
            

    }
    @Override
    public String toString() {
        //toString 메소드란 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드이다.
        return "LogModel{" +
                "time='" + time + '\'' +
                ", id='" + id + '\'' +
                ", status='" + status + '\'' +
                '}';
    }
}

 

StatusModelPart

package Version2;

import java.util.Map;

public class StatusModelPart {
	private int time;
	private int resTime;
	private int reqTime;
	private String test;
	
	

	public String getTest() {
		return test;
	}

	public void setTest(String test) {
		this.test = test;
	}

	public int getTime() {
		return time;
	}

	public void setTime(int time) {
		this.time = time;
	}
	public int getResTime() {
		return resTime;
	}

	public void setResTime(int resTime) {
		this.resTime = resTime;
	}

	public int getReqTime() {
		return reqTime;
	}

	public void setReqTime(int reqTime) {
		this.reqTime = reqTime;
	}

	public StatusModelPart(Map<String, String> map) throws IllegalAccessError{
		for(String key : map.keySet()) {
			if(map.get(key).equals("RESPONSE")) {
				setResTime(Integer.parseInt(key));
			} else {
				setReqTime(Integer.parseInt(key));
			}
		}
		
		setTime(getResTime() - getReqTime());
		if(getResTime() <= 0 || getReqTime() <= 0) {
			setTest("FAIL");
		} else {
			setTest(String.valueOf(getTime()));
		}
		
	}

	public String toString() {
		return reqTime + " " + test + (!test.equals("FAIL") ? "sec" : "");
	}
}

 

Main

package Version2;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class Main {
	
	  public static void main(String[] args) {
	        List<LogModelPart> logList = new ArrayList<>();
	        List<StatusModelPart> loglist2 = new ArrayList<>();
	        Map<String, String> test = new HashMap<String, String>();
	        HashSet hashSet = new HashSet<>();
	        
	        BufferedReader bufferedReader = new Main().fileReader();
	        try {
	            String line;
	            while ((line = bufferedReader.readLine()) != null)
	            {
	                try {
	                    LogModelPart model = new LogModelPart(line);
	                    //클래스를 new로 생성
	                   logList.add(new LogModelPart(line));
	                   hashSet.add(model.getId());
	                   //중복 제거
	                } catch (Exception e) {
	                    System.out.println(e);
	                }
	            }
	            Map[] maps = new Map[hashSet.size()];
	            //중복 제거된 사이즈만큼 map배열을 만든다.
	            for(int i=0; i<maps.length; i++) {
	            	maps[i] = new HashMap<String, String>();
	            }
	            Iterator<String> iterator = hashSet.iterator();
	            //Iterator는 hashSet을 반복 시킨다. 
	            //Iterator는 저장되어 있는 요소들을 읽어오는 방법중 하나이다.
	            
	            int cnt = 0;
	            
	            while(iterator.hasNext()) {
	            //hashNext는 boolean 자료형 타입으로 반환 
	            // ture or False로 반환
	            String str = iterator.next();
	            //next()메소드는 매개변수 혹은 iterator되는 타입으로 반환
	            for(int i=0; i<logList.size(); i++) {
	            	if(logList.get(i).getId().equals(str)) {
    					maps[cnt].put(logList.get(i).getTime(), logList.get(i).getStatus());
	            	}
	            }
	            cnt++;
	            }
	            for(int i=0; i<hashSet.size(); i++) {
	            	StatusModelPart test2 = new StatusModelPart(maps[i]);
	            	
	            	System.out.println(test2);
	            }
	            
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	        System.out.println(logList);
	    }
	  
	public BufferedReader fileReader() {
		FileReader fileReader;
		BufferedReader bufferedReader = null;
		
		try {
			String filePath= "C:\\Users\\최민준\\OneDrive\\바탕 화면\\말똥가리\\0527.txt";
			fileReader = new FileReader(filePath);
			bufferedReader = new BufferedReader(fileReader);
			
		}catch(FileNotFoundException e) {
			System.out.println("파일을 읽을수 없습니다.");
		}
		return bufferedReader;
	}
}

 

 

src.zip
0.00MB