오류 로그 찍기

Yeppi's 개발 일기·2022년 5월 25일
1

JAVA

목록 보기
26/27

1. logging 이란?

시스템 운영에 대한 기록

  • 오류가 발생 했을 때
    그 오류에 대한 기록을 남겨 디버깅 용이하게
  • 필요한 정보가 로그로 남을 수 있게
  • 디버깅, 시스템 에러 추적, 성능, 문제점 향상을 위해
  • 어느정도까지 로그를 남길 것인가?
    • 너무 적은 로그 : 정확한 시스템의 상황을 파악하기 어려움
    • 너무 많은 로그 : 빈번한 file I/O의 오버헤드와 로그 파일의 백업 문제 등

2. java.util.logging

1) 로그 레벨 & 사용법

파일이나 콘솔에 로그 내용을 출력

  • 자바에서 기본적으로 제공되는 log package
  • jre/lib/logging.properties 파일을 편집하여
    로그의 출력방식 로그 레벨을 변경 할 수 있음
  • logging 패키지에서 제공하는 로그 레벨 이란?
    severe(가장 높은 레벨)
    warning
    info
    config
    fine
    finer
    finest(가장 낮은 레벨)

  • 낮은 레벨→ 높은 레벨 순으로 log가 찍힘

  • 오픈소스로는 log4j 를 많이 사용하고 있음


2) 📌실습📌

로그 레벨

  • 정보 INFO < 경고 FINE < 심각 WARNING
    • 낮은 레벨부터 높은 레벨 순 출력
logger.setLevel(Level.INFO);
fineFile.setLevel(Level.FINE);
warningFile.setLevel(Level.WARNING);


LOG 파일

  • 프로젝트 선택 + F5 ⇒ 로그 파일 자동 생성

정보성 로그 찍기

MyLogger myLogger = MyLogger.getLogger();
myLogger.log("log test");
  • log.txt
  • fine.txt
  • warning.txt
    • warning 레벨이 fine 보다 높기때문에 warning 이 나중에 출력

콘솔 log 찍기

  • 이클립스 자동 설치

    • Preferences - Java - Installed JREs - Edit...



  • 아래 파일을 이클립스로 꺼내보기

  • INFO 로 되어있으므로, 콘솔에 정보부터 찍힌다

  • 위 빨간 표시 부분을 java.util.logging.ConsoleHandler.level = FINE 으로 변경

    • MyLogger.java 에서 logger.setLevel(Level.ALL); 로 변경하면? FINE부터 찍힌다
  • MyLogger.java

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);
				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);
			fineFile.setLevel(Level.FINE);
			warningFile.setLevel(Level.WARNING);
			
			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);
	}
}


3) 📌Logger 만들기📌

학생 정보 시스템에 로그를 기록

  • 학생의 이름에 오류가 있는 경우 예외 처리 + 예외 상황을 로그로 남기기
  • 학생의 이름은 null 이거나 중간에 space 가 3개 이상인 경우 오류 발생
  1. Logger 인스턴스 생성
  2. 로그를 남기기 위한 FileHandler 생성
  3. FileHandler 의 level을 지정
  4. Logger에 생성된 addHandler() 메서드로 FileHandler 를 추가

StudentNameFormatException.java

public class StudentNameFormatException extends IllegalArgumentException{

	public StudentNameFormatException(String message){
		super(message);
	}
}

Student.java

public class Student {

	private String studentName;
	MyLogger myLogger = MyLogger.getLogger();

	public Student(String studentName) {

		if (studentName == null) {
			throw new StudentNameFormatException("name must not be null");
		}
		if (studentName.split(" ").length > 3) { // 스페이스 3개이상
			throw new StudentNameFormatException("이름이 너무 길어요");
		}
		this.studentName = studentName;
	}

	public String getStudentName() {
    
		myLogger.fine("begin getStudentName()");
		return studentName;
	}
}

StudentTest.java

MyLogger myLogger = MyLogger.getLogger();

String name = null;
try {
	Student student = new Student(name);

} catch (StudentNameFormatException e) {
	myLogger.warning(e.getMessage());
}

try {
	Student student = new Student("yeppi Lee Kim Test");
} catch (StudentNameFormatException e) {
	myLogger.warning(e.getMessage());
}

Student student = new Student("yeppi");
String sName = student.getStudentName();

fine 로그부터 불렀을 때 각파일

  • log.txt
  • fine.txt
  • warning.txt
    • WARNINGFINE 보다 높은 레벨이기 때문에
      WARNING 이상의 레벨만 찍고, 낮은 레벨인 FINE 은 찍히지 않음

  • 콘솔창에도 잘 출력


👉 예외상황에서는 로그를 꼭 남기자

profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글