[Java 기능] 오류 로그 남기기 - java.util.logging.Logger 활용

2022. 2. 16. 13:12·Java & Kotlin

logging

  • 시스템 운영에 대한 기록
  • 버그 상황을 재현하기 힘들기 때문에 오류가 발생했을 때 기록을 남겨 디버깅을 용이하게 함
  • 로그 파일에 기록하는 코드를 추가하여 필요한 정보가 로그로 남을 수 있도록 함
  • 로그를 얼마나 남길 것인가 → 회사마다 정책이 있음
  • 로그가 너무 적으면? 정확한 시스템의 상황을 파악하기 어려움
  • 로그가 너무 많으면? 빈번한 file I/O의 오버헤드와 로그 파일의 백업 문제 등이 발생할 수 있음

 

java.util.logging

  • 자바에서 기본적으로 제공되는 log 패키지
  • 파일이나 콘솔에 로그 내용을 출력할 수 있음
  • jre/lib/logging/properties 파일에서 로그의 출력 방식 로그 레벨을 변경할 수 있음 (기본 레벨 : info)
  • logging 패키지에서 제공하는 로그 레벨 : severe, warning, info, config, fine, finer, finest
  • Handler에는 ConsoleHandler와 FileHandler가 존재한다.
  • FileHandler를 생성해서 Logger에 추가하여 파일에 write 할 수 있다.

 


 

예제 코드

MyLogger.java
  • Logger 인스턴스 생성
  • 로그를 남기기 위한 FileHandler 생성
  • FileHandler의 level을 지정
  • Logger의 addHandler() 메서드로 FileHandler 추가
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 {	// 일종의 Singleton Pattern
	
	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는 append (overwrite x)
			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.ALL);
		warningFile.setLevel(Level.WARNING);
		fineFile.setLevel(Level.FINE);
		
		logger.addHandler(logFile);	// logger에 Handler 추가
		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) {	// fine 레벨부터 메세지 출력
		logger.fine(msg);
	}
	
	public void warning(String msg) { // warning 레벨부터 메세지 출력
		logger.warning(msg);
	}

}

 

LoggerTest.java
package ch11;

public class LoggerTest {

	public static void main(String[] args) {
		
		MyLogger logger = MyLogger.getLogger();
		logger.log("log test");
	}

}

 

수행 결과

 

Console

 

로그 파일 생성

  • fine.txt, log.txt, warning.txt 파일 생성

  • log.txt : 모든 레벨 출력

  • fine.txt : fine 레벨부터 출력

  • warning.txt : warning 레벨부터 출력

 

 

MyLogger 활용하여 학생 이름 체크하여 로그 남기기

  • 학생 정보 시스템에 로그를 기록
  • 학생의 이름이 null이거나 중간에 space가 3개 이상인 경우 오류 발생
  • 학생의 이름에 오류가 있는 경우 예외 처리를 하고 로그로 남김

 

StudentNameFormatException.java
package ch11;

public class StudentNameFormatException extends IllegalArgumentException{	// 사용자 정의 예외 클래스
	
	public StudentNameFormatException(String message) {
		super(message);
	}
}

 

Student.java
  • StudentNameFormatException이 IllegalArgumentException을 상속받았기 때문에 생성자에서 throw를 해주지 않고 사용하는 쪽에서 try-catch문으로 예외처리 
package ch11;

public class Student {
	
	private String studentName;
	MyLogger logger = MyLogger.getLogger();
	
	public Student(String studentName) {
		
		if(studentName == null) {
			throw new StudentNameFormatException("name must be not null");
		}
		
		else if(studentName.split(" ").length > 3) {
			throw new StudentNameFormatException("이름이 너무 길어요");
		}
		
		this.studentName = studentName;
	}
	
	public String getStudentName() {
		
		logger.fine("begin getStudentName()");
		return studentName;
	}
}

 

StudentTest.java
package ch11;

public class StudentTest {

	public static void main(String[] args) {
		
		MyLogger logger = MyLogger.getLogger();

		String name = null;
		
		try {
			Student student = new Student(name);
		} catch(StudentNameFormatException e) {
			logger.warning(e.getMessage());
		}
		
		try {
			Student student = new Student("Park Park Park Park");
		} catch (StudentNameFormatException e) {
			logger.warning(e.getMessage());
		}
		
		Student student = new Student("James");
		student.getStudentName();
		
	}

}

 

수행 결과

 

Console

 

로그 파일 생성

  • fine.txt, log.txt

  • warning.txt

저작자표시 비영리 변경금지 (새창열림)

'Java & Kotlin' 카테고리의 다른 글

[Java 기능] I/O 스트림  (0) 2022.02.16
[Java 기능] 사용자 정의 예외 클래스  (0) 2022.02.15
[Java 기능] 예외 처리와 미루기  (0) 2022.02.15
'Java & Kotlin' 카테고리의 다른 글
  • [Java 기능] 표준 입출력 스트림
  • [Java 기능] I/O 스트림
  • [Java 기능] 사용자 정의 예외 클래스
  • [Java 기능] 예외 처리와 미루기
Sue
Sue
개발 공부 로그
  • Sue
    Sue's devlog
    Sue
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • Algorithm (2)
      • WEB (8)
      • Java & Kotlin (83)
      • Spring (26)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Sue
[Java 기능] 오류 로그 남기기 - java.util.logging.Logger 활용
상단으로

티스토리툴바