웹사이트 검색

Java의 로거 - Java 로깅 예제


오늘 우리는 Java의 Logger에 대해 살펴볼 것입니다. Java Logger는 Java 프로그래밍에서 로깅을 제공합니다.

자바의 로거

자바 로거

java.util.logging.Logger는 Java 로깅 API에서 애플리케이션 메시지를 기록하는 데 사용되는 클래스입니다. 다음과 같이 매우 간단한 한 줄 코드로 Java 로거를 만들 수 있습니다.

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

Java 로깅 수준

java.util.logging.Level은 다양한 수준의 Java 로깅을 정의합니다. Java에는 7가지 수준의 로그인이 있습니다.

  1. SEVERE(가장 높음)
  2. 경고
  3. 정보
  4. 구성
  5. 좋음
  6. 정밀
  7. 최고

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

logger.setLevel(Level.FINE);

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

Java 로깅 핸들러

Java 로거에 여러 핸들러를 추가할 수 있으며 메시지를 기록할 때마다 모든 핸들러가 그에 따라 메시지를 처리합니다. Java Logging 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";
    }

}

Java의 로거 - Java 로그 관리자

java.util.logging.LogManager는 로깅 구성을 읽고 로거 인스턴스를 생성 및 유지 관리하는 클래스입니다. 이 클래스를 사용하여 자체 애플리케이션별 구성을 설정할 수 있습니다.

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

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

handlers= java.util.logging.ConsoleHandler

.level= FINE

# default file output is in user's home directory.
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

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.journaldev.files = SEVERE

다음은 Java에서 Logger의 사용법을 보여주는 간단한 Java 프로그램입니다.

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());
        //adding custom handler
        logger.addHandler(new MyHandler());
        try {
            //FileHandler file name with max size and number of log files limit
            Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
            fileHandler.setFormatter(new MyFormatter());
            //setting custom filter for FileHandler
            fileHandler.setFilter(new MyFilter());
            logger.addHandler(fileHandler);
            
            for(int i=0; i<1000; i++){
                //logging messages
                logger.log(Level.INFO, "Msg"+i);
            }
            logger.log(Level.CONFIG, "Config data");
        } catch (SecurityException | IOException e) {
            e.printStackTrace();
        }
    }

}

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

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) {
		//don't log CONFIG logs in file
		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 로거 예제 프로젝트 다운로드

참조: 자바 로깅 API