자바 로거 사용 예 (Java Logger example )
로거의 레벨
OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL
로그를 기록하는 매체에 따라서 다양한 핸들러가 사용된다
ConsoleHandler, FileHandler, StreamHandler, SocketHandler, MemoryHandler
기본적인 로거를 사용하는 예
아무런 설정 없이 사용할 수 있는 기본 로거는 ConsoleHandler와 SimpleFormatter를 사용하며, 로그 레벨은 INFO 로 설정되어 있다
import java.util.*; import java.util.logging.*; public class LoggerTest { /* private static final Logger logger = Logger.getLogger( LoggerTest.class.getName() ); */ public static void main(String[] args) throws Exception { // Logger를 생성할 때 주어진 이름의 로거가 이미 생성되어 있다면 그 Logger를 리턴하고 // 없다면 새로 생성된다. Logger logger = Logger.getLogger(LoggerTest.class.getName()); logger.log(Level.INFO, "Start Logging"); List<Integer> list = new ArrayList<>(); logger.log( Level.INFO, "list.size()={0}", list.size() ); Object[] obj = new String[]{"A","B"}; logger.log(Level.INFO, "배열 원소={0}, {1}", obj); logger.log(Level.WARNING, "종료 {0}시간 전입니다", 1); try{ throw new Exception("심각한 오류입니다"); }catch(Exception ex){ logger.log(Level.SEVERE, "에러, {0}", ex.toString()); } //기본 로거의 레벨이 INFO 이므로 INFO 보다 낮은 레벨인 FINE 은 출력되지 않는다 logger.log(Level.FINE, "레벨 FINE 1 로그"); // 기본 로거의 레벨을 ALL 으로 설정하면 자식 핸들러에서 지정한 모든 레벨의 로그를 출력할 수 있다 logger.setLevel(Level.ALL); ConsoleHandler ch = new ConsoleHandler(); ch.setLevel(Level.FINE); SimpleFormatter sf = new SimpleFormatter(); ch.setFormatter(sf); logger.addHandler(ch); logger.log(Level.FINE, "레벨 FINE 2 로그"); } }
파일에 로그를 출력하기 위한 설정
파일에 로그를 출력하기 위해서는 FileHandler를 사용해야 한다.
FileHandler의 디폴트 포맷터로 XMLFormatter 가 설정되어 있다
FileHandler handler = new FileHandler();
FileHandler handler = new FileHandler(String pattern);
FileHandler handler = new FileHandler(String pattern, boolean append); // 파일의 크기 무제한, 파일갯수 1, 이어쓰기
FileHandler handler = new FileHandler(String pattern, int limit, int count); // 파일크기, 파일갯수 제한
FileHandler handler = new FileHandler(String pattern, int limit, int count, boolean append);
limit - 파일의 최대 크기, count - 로그파일의 수, append - 파일 내용 뒤에 이어쓰기 여부
FileHandler 생성자의 파라미터
생성자의 파라미터로 전달되는 pattern
/ The file name separator of the system. Typically either \ or / . ex) D:/test/FileLogTest.log
%t The temp directory of the system.
%h The user home directory of the system.
%g The generation number that distinguishes the rotated log files from each other.
%u A unique number to avoid naming conflicts.
%% A single percent sign, in case you want to use that in your file name.
파일이름 패턴을 적용하여 로그를 저장할 파일의 이름을 지정하는 예
logfile.log - 프로그램이 실행되는 현재 디렉토리에 'logfile.log' 가 생성됨
D:/log/logfile.log - 지정한 디렉토리에 로그파일이 생성됨
logfile%g.log - 파일명에 Generation Number 가 포함되며 현재 디렉토리에 생성됨
logfile.%u.%g.log - 파일명의 충돌을 피하기 위해 Unique 한 번호를 생성하고 사용함
FileHandler 생성자를 사용하는 예
FileHandler handler = new FileHandler("myapp-log.%u.%g.txt");
FileHandler handler = new FileHandler("myapp-log.%u.%g.txt", true);
FileHandler handler = new FileHandler("myapp-log.%u.%g.txt",1024 * 1024, 10);
FileHandler handler = new FileHandler("myapp-log.%u.%g.txt",1024 * 1024, 10, true);
특정 파일에 로그를 출력하는 예
import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; public class FileLogTest { public static void main(String[] args) throws Exception { Logger logger = Logger.getLogger(FileLogTest.class.getName()); logger.setLevel(Level.ALL); FileHandler fileHandler = new FileHandler("D:/test/FileLogTest%u.%g.log", 1024*1024, 10, true); fileHandler.setLevel(Level.ALL); SimpleFormatter sformatter = new SimpleFormatter(); fileHandler.setFormatter(sformatter); logger.addHandler(fileHandler); logger.log(Level.INFO, "레벨 INFO 로그"); logger.log(Level.WARNING, "레벨 WARNING 로그"); logger.log(Level.SEVERE, "레벨 SEVERE 로그"); logger.log(Level.FINE, "레벨 FINE 로그"); } }