자바에서 기본 제공해주는 logger를 실습해보고자 한다.
코드만 돌리기엔 심심해서 swing을 사용해서 간단한 버튼을 띄워보았고, 버튼 클릭시에 해당 level 로그가 콘솔에 띄워지고 로그파일로도 기록되게끔 해봤다.
LogFrame 클래스
ㅣ
ㅣ---- loggerInit() 메서드
ㅣ
ㅣ---- MyActionListener 내부 클래스
ㅣ
ㅣ
LogFormatter 클래스
ㅣ
ㅣ
Main 클래스
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 클래스를 선언
	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 발생");
			}		
		}
	}
//로그 포맷 변경
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 와 같은 포맷을 만들기 위해 SimpleDateFormat과 Date를 생성 후 format을 설정하였다.
문자열을 만들기 위해서 StringBuffer를 사용해 원하는 형태로 조합
조합한 문자열을 반환
public class Main {
	public static void main(String[] args) {
		new LogFrame();
	}
}

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

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

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