Java 로거 – Java 로깅 예제

오늘은 자바의 Logger를 살펴보겠습니다. 자바 Logger는 자바 프로그래밍에서 로깅을 제공합니다.

Java의 Logger

Java 로깅 API는 1.4에서 소개되었으며 애플리케이션 메시지를 기록하기 위해 Java 로깅 API를 사용할 수 있습니다. 이 자바 로깅 튜토리얼에서는 Java Logger의 기본 기능을 배웁니다. 또한 다양한 로깅 레벨, 로깅 핸들러, 포매터, 필터, 로그 관리자 및 로깅 구성의 Java Logger 예제를 살펴볼 것입니다.

자바 Logger

java.util.logging.Logger는 자바 로깅 API에서 애플리케이션 메시지를 기록하는 데 사용되는 클래스입니다. 매우 간단한 한 줄의 코드로 자바 Logger를 생성할 수 있습니다;

Logger logger = Logger.getLogger(MyClass.class.getName());

Java 로깅 레벨

java.util.logging.Level은 자바 로깅의 다른 수준을 정의합니다. 자바에서 로깅에는 일곱 가지 수준이 있습니다.

  1. SEVERE (가장 높음)
  2. WARNING
  3. INFO
  4. CONFIG
  5. FINE
  6. FINER
  7. FINEST

두 가지 다른 로깅 수준이 있습니다. OFF는 모든 로깅을 끕니다. ALL은 모든 메시지를 기록합니다. 다음 코드를 사용하여 로거 수준을 설정할 수 있습니다:

logger.setLevel(Level.FINE);

로거 수준보다 크거나 같은 모든 수준에 대해 로그가 생성됩니다. 예를 들어, 로거 수준이 INFO로 설정된 경우, INFO, WARNING 및 SEVERE 로깅 메시지에 대해 로그가 생성됩니다.

Java 로깅 핸들러

자바 로거에 여러 핸들러를 추가할 수 있으며, 메시지를 로깅할 때마다 각 핸들러가 그것을 처리합니다. Java 로깅 API에서 제공하는 두 가지 기본 핸들러가 있습니다.

  1. ConsoleHandler: 이 핸들러는 모든 로깅 메시지를 콘솔에 작성합니다.
  2. FileHandler: 이 핸들러는 모든 로깅 메시지를 XML 형식으로 파일에 작성합니다.

우리는 특정 작업을 수행하기 위해 자체 사용자 정의 핸들러도 만들 수 있습니다. 사용자 정의 Handler 클래스를 만들려면 java.util.logging.Handler 클래스 또는 StreamHandler, SocketHandler 등의 하위 클래스 중 하나를 확장해야 합니다. 다음은 사용자 정의 java 로깅 핸들러의 예입니다:

package com.journaldev.log;

import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;

public class MyHandler extends StreamHandler {

    @Override
    public void publish(LogRecord record) {
        //add own logic to publish
        super.publish(record);
    }


    @Override
    public void flush() {
        super.flush();
    }


    @Override
    public void close() throws SecurityException {
        super.close();
    }

}

Java 로깅 포매터

포매터는 로그 메시지를 서식화하는 데 사용됩니다. Java 로깅 API에는 두 가지 유형의 포매터가 있습니다.

  1. SimpleFormatter: 이 포매터는 기본 정보를 포함한 텍스트 메시지를 생성합니다. ConsoleHandler는 로그 메시지를 콘솔에 출력하기 위해 이 포매터 클래스를 사용합니다.
  2. XMLFormatter: 이 포매터는 로그를 위한 XML 메시지를 생성합니다. FileHandler는 기본 포매터로 XMLFormatter를 사용합니다.

우리는 java.util.logging.Formatter 클래스를 확장하여 자체 사용자 정의 Formatter 클래스를 만들고 핸들러 중 하나에 첨부할 수 있습니다. 다음은 간단한 사용자 정의 포매터 클래스의 예입니다.

package com.journaldev.log;

import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

public class MyFormatter extends Formatter {

    @Override
    public String format(LogRecord record) {
        return record.getThreadID()+"::"+record.getSourceClassName()+"::"
                +record.getSourceMethodName()+"::"
                +new Date(record.getMillis())+"::"
                +record.getMessage()+"\n";
    }

}

자바에서의 Logger – 자바 로그 관리자

java.util.logging.LogManager는 로깅 구성을 읽고 로거 인스턴스를 생성하고 유지하는 클래스입니다. 이 클래스를 사용하여 우리만의 응용 프로그램 구성을 설정할 수 있습니다.

LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));

다음은 Java Logging API 구성 파일의 예입니다. 구성을 지정하지 않으면 JRE 홈 lib/logging.properties 파일에서 읽습니다. mylogging.properties

handlers= java.util.logging.ConsoleHandler

.level= FINE

# 기본 파일 출력은 사용자 홈 디렉토리에 있습니다.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# 콘솔에 인쇄되는 메시지를 INFO 및 그 이상으로 제한합니다.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.journaldev.files = SEVERE

다음은 Java에서 Logger를 사용하는 간단한 프로그램의 예입니다.

package com.journaldev.log;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class LoggingExample {

    static Logger logger = Logger.getLogger(LoggingExample.class.getName());
    
    public static void main(String[] args) {
        try {
            LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
        } catch (SecurityException | IOException e1) {
            e1.printStackTrace();
        }
        logger.setLevel(Level.FINE);
        logger.addHandler(new ConsoleHandler());
        // 사용자 정의 핸들러 추가
        logger.addHandler(new MyHandler());
        try {
            // 최대 크기와 로그 파일 제한 수를 가진 FileHandler 파일 이름
            Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
            fileHandler.setFormatter(new MyFormatter());
            // FileHandler에 대한 사용자 정의 필터 설정
            fileHandler.setFilter(new MyFilter());
            logger.addHandler(fileHandler);
            
            for(int i=0; i<1000; i++){
                // 로깅 메시지
                logger.log(Level.INFO, "Msg"+i);
            }
            logger.log(Level.CONFIG, "Config data");
        } catch (SecurityException | IOException e) {
            e.printStackTrace();
        }
    }

}

위의 java logger 예제 프로그램을 실행하면 CONFIG 로그가 파일에 인쇄되지 않음을 알 수 있습니다. 이는 MyFilter 클래스 때문입니다.

package com.journaldev.log;

import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

public class MyFilter implements Filter {

	@Override
	public boolean isLoggable(LogRecord log) {
		// 파일에 CONFIG 로그를 기록하지 않습니다.
		if(log.getLevel() == Level.CONFIG) return false;
		return true;
	}

}

또한 출력 형식은 MyFormatter 클래스에서 정의한 것과 같습니다.

1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg977
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg978
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg979
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg980

FileHandler에 자체 Formatter 클래스를 추가하지 않으면 로그 메시지가 다음과 같이 인쇄됩니다.

<record>
  <date>2012-12-14T17:03:13</date>
  <millis>1355533393319</millis>
  <sequence>996</sequence>
  <logger>com.journaldev.log.LoggingExample</logger>
  <level>INFO</level>
  <class>com.journaldev.log.LoggingExample</class>
  <method>main</method>
  <thread>1</thread>
  <message>Msg996</message>
</record>

콘솔 로그 메시지는 다음 형식입니다:

Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg997
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998

아래 이미지는 최종 Java Logger 예제 프로젝트를 보여줍니다. 이것이 Java에서의 Logger 및 Java Logger 예제에 대한 전부입니다. 프로젝트를 아래 링크에서 다운로드할 수 있습니다.

Java 로거 예제 프로젝트 다운로드

참조: Java 로깅 API

Source:
https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example