logging
- 시스템 운영에 대한 기록
- 버그 상황을 재현하기 힘들기 때문에 오류가 발생했을 때 기록을 남겨 디버깅을 용이하게 함
- 로그 파일에 기록하는 코드를 추가하여 필요한 정보가 로그로 남을 수 있도록 함
- 로그를 얼마나 남길 것인가 → 회사마다 정책이 있음
- 로그가 너무 적으면? 정확한 시스템의 상황을 파악하기 어려움
- 로그가 너무 많으면? 빈번한 file I/O의 오버헤드와 로그 파일의 백업 문제 등이 발생할 수 있음
java.util.logging
- 자바에서 기본적으로 제공되는 log 패키지
- 파일이나 콘솔에 로그 내용을 출력할 수 있음
- jre/lib/logging/properties 파일에서 로그의 출력 방식 로그 레벨을 변경할 수 있음 (기본 레벨 : info)
- logging 패키지에서 제공하는 로그 레벨 : severe, warning, info, config, fine, finer, finest
- Handler에는 ConsoleHandler와 FileHandler가 존재한다.
- FileHandler를 생성해서 Logger에 추가하여 파일에 write 할 수 있다.
예제 코드
MyLogger.java
- Logger 인스턴스 생성
- 로그를 남기기 위한 FileHandler 생성
- FileHandler의 level을 지정
- Logger의 addHandler() 메서드로 FileHandler 추가
package ch11;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
public class MyLogger { // 일종의 Singleton Pattern
Logger logger = Logger.getLogger("mylogger");
private static MyLogger instance = new MyLogger();
public static final String errorLog = "log.txt";
public static final String warningLog = "warning.txt";
public static final String fineLog = "fine.txt";
private FileHandler logFile = null;
private FileHandler warningFile = null;
private FileHandler fineFile = null;
private MyLogger() {
try {
logFile = new FileHandler(errorLog, true); // true는 append (overwrite x)
warningFile = new FileHandler(warningLog,true);
fineFile = new FileHandler(fineLog,true);
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
logFile.setFormatter(new SimpleFormatter());
warningFile.setFormatter(new SimpleFormatter());
fineFile.setFormatter(new SimpleFormatter());
logger.setLevel(Level.ALL);
warningFile.setLevel(Level.WARNING);
fineFile.setLevel(Level.FINE);
logger.addHandler(logFile); // logger에 Handler 추가
logger.addHandler(warningFile);
logger.addHandler(fineFile);
}
public static MyLogger getLogger() {
return instance;
}
public void log(String msg) { // 모든 레벨의 메세지 출력
logger.finest(msg);
logger.finer(msg);
logger.fine(msg);
logger.config(msg);
logger.info(msg);
logger.warning(msg);
logger.severe(msg);
}
public void fine(String msg) { // fine 레벨부터 메세지 출력
logger.fine(msg);
}
public void warning(String msg) { // warning 레벨부터 메세지 출력
logger.warning(msg);
}
}
LoggerTest.java
package ch11;
public class LoggerTest {
public static void main(String[] args) {
MyLogger logger = MyLogger.getLogger();
logger.log("log test");
}
}
수행 결과
Console
로그 파일 생성
- fine.txt, log.txt, warning.txt 파일 생성
- log.txt : 모든 레벨 출력
- fine.txt : fine 레벨부터 출력
- warning.txt : warning 레벨부터 출력
MyLogger 활용하여 학생 이름 체크하여 로그 남기기
- 학생 정보 시스템에 로그를 기록
- 학생의 이름이 null이거나 중간에 space가 3개 이상인 경우 오류 발생
- 학생의 이름에 오류가 있는 경우 예외 처리를 하고 로그로 남김
StudentNameFormatException.java
package ch11;
public class StudentNameFormatException extends IllegalArgumentException{ // 사용자 정의 예외 클래스
public StudentNameFormatException(String message) {
super(message);
}
}
Student.java
- StudentNameFormatException이 IllegalArgumentException을 상속받았기 때문에 생성자에서 throw를 해주지 않고 사용하는 쪽에서 try-catch문으로 예외처리
package ch11;
public class Student {
private String studentName;
MyLogger logger = MyLogger.getLogger();
public Student(String studentName) {
if(studentName == null) {
throw new StudentNameFormatException("name must be not null");
}
else if(studentName.split(" ").length > 3) {
throw new StudentNameFormatException("이름이 너무 길어요");
}
this.studentName = studentName;
}
public String getStudentName() {
logger.fine("begin getStudentName()");
return studentName;
}
}
StudentTest.java
package ch11;
public class StudentTest {
public static void main(String[] args) {
MyLogger logger = MyLogger.getLogger();
String name = null;
try {
Student student = new Student(name);
} catch(StudentNameFormatException e) {
logger.warning(e.getMessage());
}
try {
Student student = new Student("Park Park Park Park");
} catch (StudentNameFormatException e) {
logger.warning(e.getMessage());
}
Student student = new Student("James");
student.getStudentName();
}
}
수행 결과
Console
로그 파일 생성
- fine.txt, log.txt
- warning.txt
'Java & Kotlin' 카테고리의 다른 글
[Java 기능] I/O 스트림 (0) | 2022.02.16 |
---|---|
[Java 기능] 사용자 정의 예외 클래스 (0) | 2022.02.15 |
[Java 기능] 예외 처리와 미루기 (0) | 2022.02.15 |