본문 바로가기

Java Logger/Logger example

Java Logger example

자바 로거 사용 예 (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 로그");
	}
}