본문 바로가기
JSP/JSP기초

JSP(Ch12) 필터 사용 로그기록 파일에 저장해보기

by 미눅스[멘토] 2023. 7. 13.
728x90

 

LogfileFilter 클래스를 생성한다.

 

 

 

 

 

 

생성된 Class에 Filter-java.servlet을 implements(상속) 해주고

 

 

 

 

상속된 메소드를 오버라이딩 해준다.

 

 

 

 

 

 

 

보기좋게 intit -> doFilter -> destroy순으로 순서를 정렬해줌

 

 

 

web.xml로 가서 

filter태그와

filter-mapping 태그를 정의 해주고

init-param에 파라미터값을 저장해준다.

 

여기서 filter태그와

filter-mapping 태그 안에 있는

filter-name이 같아야 하고

 

filter태그안에 filter-class에

패키지.클래스명

 

filter-mapping태그안에 url-pattern에

jsp파일 URL을 작성해준다.

 

 

  <!-- 로그 파일 저장 -->
  <filter>
  	<filter-name>LogFileFilter</filter-name>
  	<filter-class>filter.LogFileFilter</filter-class>
  	<!-- 로그가 저장될 파일의 위치 지정. LogFileFilter의 init()메소드에 초기화 파라미터를 보냄 -->
  	<init-param>
  		<param-name>filename</param-name>
  		<param-value>c:\\logs\\monitor.log</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>LogFileFilter</filter-name>
  	<url-pattern>/ch12/filter02_process.jsp</url-pattern>
  </filter-mapping>

 

 

 

그리고 다시 class로 돌아와서

나머지 코드를 작성해주고

 

 

 

 

 

 

filterConfig.getInitPatameter("filename"); 경로에 파일이 없기 떄문에

경로에 파일을 미리 만들어 둔다.

 

 

 

 

 

 

파일 생성하고 클래스로 돌아와서 메소드 작성

 

 

 

package filter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class LogfileFilter  implements Filter{
	private FilterConfig filterConfig = null;
	
	//파일로 만들어야 하므로 파일객체를 전역변수 형태로 선언
	PrintWriter writer;
	
	/*
  	<init-param>
  		<param-name>filename</param-name>
  		<param-value>c:\\logs\\monitor.log</param-value>
  	</init-param>
	*/
	
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		String filename = 
				filterConfig.getInitParameter("filename"); //c:\\logs\\monitor.log
		this.filterConfig = filterConfig;
		//FileWriter(String fileName,boolean true/false)
		//1) true : 기존 내용에 새로운 내용이 추가(append)
		//2) false : 기존 내용을 지고 덮어쓰기(overwrite)
		//PrintWriter(출력대상, boolean true/false)
		//1) true : Auto flush -> writer.flush()를 생략함
		//2) false : Auto flush 안함
		try {
			writer = new PrintWriter(new FileWriter(filename,true),true);
			
			//monitor.log 파일이 없으면 자동 생성
			//이렇게 하겟다라고 설계
			File file = new File(filename);
			
			
			if(!file.exists()) {//설계상의 파일이 실제 없으면..
				//파일을 생성
				file.createNewFile();
				
				writer.println(file.getAbsolutePath() + "파일이 생성되었습니다.");
			}else {
				System.out.println(file.getAbsolutePath() + "파일이 생성되어 있습니다.");
			}
		} catch (IOException e) {
			throw new ServletException("로그 파일을 열 수 없습니다.");
		}
	}
		

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
	
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
		
		writer.println("접속한 클라이언트 id : "+id);
		writer.println("접속한 클라이언트 passwd : "+ passwd);
		
		writer.println("접속한 클라이언트 IP : " + request.getRemoteAddr());
		//시스템 현재 시간(시작시간)
		long start = System.currentTimeMillis();
		writer.println("접근한 URL 경로 : " + getURLPath(request));
		writer.println("요청 처리 시작 시간:" + getCurrentTime());
		
		//필터가 연속적으로 있다면 다음 필터로 제어 및 요청(request) / 응답(response) 정보를 넘겨줌
		chain.doFilter(request, response);
		
		//시스템 현재 시간(종료시간)
		long end = System.currentTimeMillis();
		writer.println("요청 처리 종료 시각 : " + getCurrentTime());
		writer.println("요청 처리 소요 시간 : " + (end - start) + "ms");
		writer.println("=============================================");
	}

	@Override
	public void destroy() {
		//파일 객체를 닫아줌, 메모리에서 제거
		writer.close();
	}

	//접근한 URL 결로 리턴 메소드
	//ch12/filter02_process.jsp?name=개똥이
	// ServletRequest(국밥) -> HttpServletRequest(콩나물국밥) : 조금더 상세한 정보 
	private String getURLPath(ServletRequest request) {
		//HttpServletRequest인터페이스는 ServletRequest 인W터페이스를 상속받음
		HttpServletRequest req;
		//currentPath : URL경로 => ch12/filter02_process.jsp
		String currentPath = "";
		//cueryString : 요청파라미터 => name = 개똥이
		String queryString ="";
		//instanceof 연산자 : 객체가 어떤 클래스인지 , 어떤 클래스를 상속받았는지 확인할 때 사용
		if(request instanceof HttpServletRequest) {
			//자식 = (cast)부모
			req = (HttpServletRequest)request;
			currentPath = req.getRequestURI(); // ch12/filter02_process.jsp
			System.out.println(currentPath);
			queryString = req.getQueryString();	//name =개똥이
			//삼항연산자
			queryString = queryString == null? "":"?"+ queryString;
		}
		
		req = (HttpServletRequest)request;
		//ch12/filter02_process.jsp?name =개똥이
		return currentPath + queryString;
	}
	
	//현재 시간을 얻어오는 메소드
	private String getCurrentTime() {
		//2023/07/13  10:25:12
		DateFormat formatter = new SimpleDateFormat("yyyy/MM//dd HH:mm:ss");
		//캘린더 객체 생성(싱글톤 : 메모리에 1번 생성하고 전역변수처럼 사용)
		Calendar calendar = Calendar.getInstance();
		//톰캣서버에서 제공해주는 시스템 련재 시간을 구해서 캘린더 객체에 세팅한다.
		calendar.setTimeInMillis(System.currentTimeMillis());
		return formatter.format(calendar.getTime());
		
	}
	
}

해석은 알아서...

 

 

 

실행을 하면 파일이 생성되었다고 문자가 출력되고

 

 

 

 

 

 

 

접속해서 사이트에 아이디 비밀번호를 치면

 

 

 

 

 

 

 

아까 만들어 놨던 폴더에 만들어진 메모장 발견

메모장에 들어가 보면

 

 

이렇게 출력된것을 볼 수 있다.

아이디와 비밀번호는

개인정보를 위해 없애주는게 맞지만 

실험삼아 해봄