시스템 운영에 대한 기록으로 오류가 발생했을 때 그 오류에 대하 기록을 남겨 디버깅을 할 떄 사용할 수 있다.
프로그래밍을 할 때는 로그 파일에 기록하는 코드를 추가하여 필요한 정보가 로그로 남을 수 있도록 한다.
디버깅, 시스템 에러 추적, 성능과 문제점 향상 등을 위해 log를 사용한다.
로그는 너무 적게 남기면 정확한 시스템의 상황을 파악하기 어렵게되며 반대로 너무 많은 로그를 남기면 빈번한 file I/O의 overhead와 로그파일의 백업 문제 등이 발생한다. 그래서 적당한 수의 로그를 남기도록 해야한다.
java.util.logging는 자바에서 기본적으로 제공하는 log package로 파일이나 콘솔 로그에 내용을 출력할 수 있게 해준다.
로그에는 레벨이 있으며 logging 패키지에서 제공하는 로그 레벨은 severe, warning, info, config, fine, finer, finest이 있다.
jre/lib/logging.properties 파일을 편집하여 로그의 출력방식 로그 레벨을 변경 할 수 있다.
위의 jre/lib/logging.properties 파일의 java.util.logging.ConsoleHandler.level의 값을 변경하여 출력 log레벨을 변경할 수 있다.
MyLogger.java
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 {
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를 하면 뒤에 이어서 log를 찍는다.
warningFile = new FileHandler(warningLog, true);
fineFile = new FileHandler(fineLog, true);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
logFile.setFormatter(new SimpleFormatter());
warningFile.setFormatter(new SimpleFormatter());
fineFile.setFormatter(new SimpleFormatter());
logger.setLevel(Level.ALL); // 모든 level을 다 찍겠다.
fineFile.setLevel(Level.FINE); // fine level부터 찍겠다.
warningFile.setLevel(Level.WARNING); // warning level부터 찍겠다.
logger.addHandler(logFile);
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){
logger.fine(msg);
}
public void warning(String msg){
logger.warning(msg);
}
}
LoggerTest.java
package ch11;
public class LoggerTest {
public static void main(String[] args) {
MyLogger myLogger = MyLogger.getLogger();
myLogger.log("test");
}
}
txt파일에 저장된 log결과
다음 결과를 통해 log출력 범위를 정하는 것에 따라 출력 범위가 달라지는 것을 알 수 있다.
Console에 나오는 log결과