티스토리 뷰

프로그래밍/Java

Log 남기기

국윤창 2018. 8. 9. 17:53

프로그램에서 Log를 남기는 여러가지 방법이 있다. 가장 쉽고 많이 사용하는 방법이 콘솔에 남기는 것인데, 보기가 까다롭다.

로그를 위한 여러 라이브러리가 많지만 라이브러리를 사용하지 않아도 자바에서 제공해주는 로그 클래스가 있다.


Logger 클래스는 JDK 1.7부터 제공한다. 별다른 설정없이 사용한다면, 에러나 경고가 생겼을 때 콘솔에 남는 모양새로 똑같이 로그가 콘솔에 남게 된다. 이를 제대로 사용하기 위해선 Logger에 추가로 설정을 해줘야 한다.


1. Logger 기본 기능

Logger는 계층구조로 되어있다. default로 있는 Logger는 global로 모든 다른 Logger의 부모이다.

우선, 기본으로 있는 global Logger를 사용해보자. 아래처럼 Logger.getLogger 라는 이름의 static 함수를 호출하여 Logger 객체를 얻어서 사용할 수 있다.

Logger logger = Logger.getLogger("");

// info 이상의 정보만 기록
logger.setLevel(Level.INFO);

// warning 경고 남기기
logger.warning("경고 로그");

getLogger의 파라미터는 Logger의 이름으로, 빈 문자열이면 global Logger를 가져온다. 만약 다른 문자열을 넣는다면, 해당 이름의 Logger를 가져온다.

중요한 것은 만약 Logger가 존재하지 않는다면 새로 생성한다는 것이다. 따로 create 함수같은 것이 없고 getLogger 함수를 통해 Logger를 바로 생성하고 가져온다는 것을 기억하자.


Logger는 로그의 수준을 가지고 있어서 심각, 경고, 정보 등으로 나눠서 로그를 남길 수 있도록 한다. 위 코드에서 Logger 객체의 수준을 INFO로 지정하였는데, "정보" 이상의 수준을 가지고 있는 로그만 기록한다는 의미이다.


Logger로 로그를 남기는 것은 severe, warning, info 등의 멤버 함수를 통해서 남길 수 있다. 다른 방법으로 멤버 함수 log를 통해 남길수도 있다. log 함수는 로그의 수준, 메시지, 매개변수 등을 받는다.


2. File에 로그 남기기

콘솔 말고 텍스트 파일 등에 로그를 남기고 싶다면, 로그 객체를 만들어서 설정해야한다. 아래 코드처럼 getLogger 함수를 이용해 Logger 객체를 만들고, 텍스트 파일의 핸들러를 추가해보자.

Logger logger = Logger.getLogger("CustomLogger");

try {
	Handler textHandler = new FileHandler("program-log.txt", true);
	logger.addHandler(textHandler);
} catch (Exception e) {
	logger.severe("로그 텍스트 파일의 핸들러를 얻을 수 없습니다.");
}

위처럼 FileHandler를 만들어서 Logger 객체에 추가하면 된다. 그러면, 앞으로 로그를 남길 때마다 지정한 파일에도 남게 된다.

주의할 것은 위 코드에서 새로 만들어진 CustomLogger는 global Logger의 자식이라는 것이다. 따라서 CustomLogger로 로그를 남길때마다 핸들러로 등록한 텍스트 파일뿐만 아니라 콘솔에도 로그가 남겨진다는 것을 유의해야 한다.


만약 global Logger의 핸들러를 없애버리고 싶다면 아래처럼 하면 된다.

// global Logger 얻기
Logger logger = Logger.getLogger("");

Handler[] handlers = logger.getHandlers();
for(Handler handler : handlers) {
	logger.removeHandler(handler);
}

하지만 global Logger는 기본적으로 콘솔창에 로그가 남겨질 때 사용되는 Logger이므로, 이렇게 지워버리면 본인이 남기는 로그를 제외하고는 로그가 전혀 남지가 않는다. 별로 추천하고 싶지 않은 방법이다.


3. Formatter 만들기

로그를 남길 때, 기본으로 있는 formatter와 다른 방법으로 남기고 싶다면 formatter를 설정할 수 있다. formatter는 java.util.loggin.Formatter 클래스를 상속 받아서 만들 수 있다. 핵심은 format 메서드를 재정의(override) 하는 것이다.

format 함수에는 LogRecord라는 객체가 인자로 넘어오는데, 이곳에 로그를 남길 곳의 위치, 시간, 수준, 메시지 등이 들어있다.

Formatter 클래스는 아래처럼 만들 수 있다.

public class CustomLogFormatter extends Formatter {
	@Override
	public String format(LogRecord record) {
		StringBuffer outBuf = new StringBuffer(500);

		outBuf.append(" * ");
		outBuf.append(calcDate(record.getMillis()));
		outBuf.append(" ");
		outBuf.append(record.getSourceClassName());
		outBuf.append(" ");
		outBuf.append(record.getSourceMethodName());
		outBuf.append("\r\n");

		outBuf.append(" [");
		outBuf.append(record.getLevel());
		outBuf.append("] ");
		outBuf.append(record.getMessage());
		outBuf.append("\r\n");

		return outBuf.toString();
	}

	private String calcDate(long milliseconds) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date resultDate = new Date(milliseconds);
		return dateFormat.format(resultDate);
	}
}

이렇게 만들어진 formatter는 아래처럼 Handler에 설정해서 Logger 객체에 적용할 수 있다.

CustomLogFormatter logFormatter = new CustomLogFormatter();

...

Handler textHandler = new FileHandler("program-log.txt", true);
textHandler.setFormatter(logFormatter);
logger.addHandler(textHandler);




* 참고

http://www.gisdeveloper.co.kr/?p=5174


http://www.vogella.com/tutorials/Logging/article.html

'프로그래밍 > Java' 카테고리의 다른 글

Garbage Collection (Hotspot JVM GC)  (1) 2019.05.21
JVM 구조 및 메모리  (0) 2019.02.11
Log 남기기  (0) 2018.08.09
Stream  (0) 2018.07.24
Java thread-safe singleton  (0) 2018.07.18
댓글
댓글쓰기 폼