logging
- 시스템 운영에 대한 기록
- 오류가 발생했을 때 그 오류에 대한 기록을 남겨 디버깅을 용이하게 함
- 로그 파일에 기록하는 코드를 추가하여 필요한 정보가 로그로 남을 수 있도록 한다.
- 디버깅, 시스템 에러 추적, 성능, 문제점 향상등을 위해 사용
- 어느정도까지 로그를 남길 것인가
너무 적은 로그 : 정확한 시스템의 상황을 파악하기 어려움
너무 많은 로그 : 번번한 file I/O의 오버헤드와 로그 파일의 백업 문제 등
java.util.logging
- 자바에서 기본적으로 제공되는 log package
- 파일이나 콘솔에 로그 내용을 출력할 수 있음
- jre/lib/logging.properties 파일을 편집하여 로그의 출력방식 로그 레벨을 변경 할 수 있음
- logging 패키지에서 제공하는 로그 레벨은 severe, warning, info, config, fine, finer, finest 임
- 오픈소스로는 log4j를 많이 사용하고 있음
Logger 만들기
- 시나리오
학생 정보 시스템에 로그를 기록하도록 한다.
학생의 이름에 오류가 있는 경우 예외 처리를 하고 예외 상황을 로그로 남긴다.
학생의 이름은 null 이거나 중간에 space가 3개 이상인 경우 오류가 발생한다.
- 구현하기
Logger 인스턴스를 생성한다.
로그를 남기기 위한 FileHandler를 생성한다.
FileHandler의 level을 지정하고 Logger에 생성된 addHandler() 메서드로 FileHandler를 추가한다.
예제
MyLogger.java
public class MyLogger {
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);
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.INFO);
fineFile.setLevel(Level.FINE);
warningFile.setLevel(Level.WARNING);
}
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) {
logger.fine(msg);
}
public void warning(String msg) {
logger.warning(msg);
}
}
- LoggerTest.java
public class LoggerTest {
public static void main(String[] args) {
MyLogger logger = MyLogger.getLogger();
logger.log("error test");
}
}
- Student.java
public class Student {
private String studentName;
MyLogger myLogger = MyLogger.getLogger();
public Student(String studentName) {
if(studentName == null) {
throw new StudentNameFormatException("name must not be null");
}
if(studentName.split(" ").length > 3)
throw new StudentNameFormatException("이름이 너무 길어요");
this.studentName = studentName;
}
public String getStudentName() {
myLogger.fine("begin getStudentName()");
return studentName;
}
}
- StudentTest.java
public class StudentTest {
public static void main(String[] args) {
MyLogger myLogger = MyLogger.getLogger();
String name = null;
try {
Student student = new Student(name);
}catch(StudentNameFormatException e) {
myLogger.warning(e.getMessage());
}
try {
Student student = new Student("Edward Jon Kim Test");
}catch( StudentNameFormatException e) {
myLogger.warning(e.getMessage());
}
Student student = new Student("Ja");
}
}
- StudentNameFormatException.java
public class StudentNameFormatException extends IllegalArgumentException{
public StudentNameFormatException(String message) {
super(message);
}
}
'프로그래밍 언어 > JAVA(자바) 응용' 카테고리의 다른 글
62.표준 입출력 스트림 (0) | 2022.06.06 |
---|---|
61.자바의 입출력을 위한 I/O 스트림 (0) | 2022.06.05 |
59.사용자 정의 예외클래스 (0) | 2022.06.03 |
58.예외 처리하기와 미루기 (0) | 2022.06.02 |
57.예외처리 (0) | 2022.06.02 |
댓글