자바 기본 제공 logger 실습

H_dev·2022년 4월 27일
1

📝 이번 글에서는?

자바에서 기본 제공해주는 logger를 실습해보고자 한다.
코드만 돌리기엔 심심해서 swing을 사용해서 간단한 버튼을 띄워보았고, 버튼 클릭시에 해당 level 로그가 콘솔에 띄워지고 로그파일로도 기록되게끔 해봤다.


📌 실습코드

LogFrame 클래스

ㅣ---- loggerInit() 메서드

ㅣ---- MyActionListener 내부 클래스


LogFormatter 클래스


Main 클래스

LogFrame.java

public class LogFrame extends JFrame{
	private final static Logger LOGGER = Logger.getGlobal(); 
	private final static String LOG_FILE = "C:/workspace/mylog.txt";
	
	public LogFrame() {
		// swing 생성
		JButton infoButton = new JButton("info");
		JButton warnButton = new JButton("warn");
		JButton severeButton = new JButton("Severe");
		MyActionListener myActionListener = new MyActionListener();
		
		infoButton.setBounds(100, 100, 100, 50);
		warnButton.setBounds(100, 200, 100, 50);
		severeButton.setBounds(100, 300, 100, 50);
		
		infoButton.addActionListener(myActionListener);
		warnButton.addActionListener(myActionListener);
		severeButton.addActionListener(myActionListener);
		
		add(infoButton);
		add(warnButton);
		add(severeButton);
		
		setTitle("logger 예제");
		setSize(300, 500);
		setLayout(null);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		// 생성완료
		
		
		loggerInit(); // logger 설정
	}
  • 먼저 사용할 LOGGER와 출력파일 경로를 선언하고 생성자에서 JFrame 및 JButton을 생성한다.

  • 마지막에 있는 loggerInit() 을 통해 원하는 포맷을 지정하고, 파일로 출력할 수 있도록 세팅한다.

	public void loggerInit() {
		// 디폴트 형태의 로그 출력 안함
		LOGGER.setUseParentHandlers(false);
		
		// 포맷변경을 위해
		LogFormatter formatter = new LogFormatter();
		
		// 콘솔, 파일핸들러 추가
		Handler handler = new ConsoleHandler();
		Handler fileHandler = null;
		
		try {
			// 뒤에 이어쓰기위해 true
			fileHandler = new FileHandler(LOG_FILE, true);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		handler.setFormatter(formatter);
		fileHandler.setFormatter(formatter);
		LOGGER.addHandler(handler);
		LOGGER.addHandler(fileHandler);
	}
  • 기본 형식으로 되어있는 상위 핸들러를 사용하지 않도록 설정하였다.

  • 원하는 포맷으로 설정하기 위해 생성한 Logformatter를 적용하였다.

  • 콘솔에 출력하고, 파일로도 저장하기 위해 Handler를 생성해 추가하는 설정을 위한 초기화 메서드이다.


또한 버튼에 ActionListner를 추가해서 버튼별로 다른 로그가 찍히도록 하였다.
-> 내부클래스로 ActionListner를 implements한 MyActionListener 클래스를 선언

LogFrame -> MyActionListener 내부클래스

	class MyActionListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			JButton b = (JButton) e.getSource(); // 이벤트 발생한 버튼
			
			if (b.getText().equals("info")) {
				LOGGER.info("info log 발생");
			}
			else if (b.getText().equals("warn")) {
				LOGGER.warning("warn log 발생");
			}
			else {
				LOGGER.severe("severe log 발생");
			}		
		}
	}
  • 이벤트가 발생한 버튼을 받아온 후, 버튼의 텍스트를 비교한다.
  • 알맞은 레벨의 로그를 발생시키는 코드.

LogFormatter.java

//로그 포맷 변경
public class LogFormatter extends Formatter {

	@Override
	public String format(LogRecord record) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 출력 포맷 지정
		Date date = new Date(record.getMillis());  // 시간 받기
		
		
		// 문자열 변경을 위해 buffer 사용
		StringBuffer buffer = new StringBuffer(1000);
		buffer.append("[발생시간] " + dateFormat.format(date));
		buffer.append(" [" + record.getLevel() + "] ");
		buffer.append(record.getMessage() + "\n");
		// [발생시간] 2022-04-27 10:00 [info] ~~~~log
		
		// 문자열로 반환
		return buffer.toString();
	}
	
}
  • Fomatter 클래스를 상속받아서 format 메서드를 오버라이딩하였다.

  • 2022-04-27 10:00 와 같은 포맷을 만들기 위해 SimpleDateFormatDate를 생성 후 format을 설정하였다.

  • 문자열을 만들기 위해서 StringBuffer를 사용해 원하는 형태로 조합

  • 조합한 문자열을 반환


Main.java

public class Main {

	public static void main(String[] args) {
		new LogFrame();
	}

}
  • 프레임을 실행하는 코드만 따로 존재

결과

각 버튼을 클릭하면 다음과 같이 콘솔에도 바로 찍히는 것을 확인

다음으로 mylog 파일로도 찍히는 것을 확인할 수 있었다. (앞의 내용은 누적)

이렇게 간단한 예제코드도 작성하면서 살짝 헤맸지만 화이팅!!

profile
성장 개발일지

0개의 댓글