자바에서 기본 제공해주는 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 파일로도 찍히는 것을 확인할 수 있었다. (앞의 내용은 누적)
이렇게 간단한 예제코드도 작성하면서 살짝 헤맸지만 화이팅!!