Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)

Java에서 기본으로 제공하는 Logging API를 사용하여 로그를 출력하고 파일에 저장하는 방법을 소개합니다.

Log 출력

다음과 같이 Logger 객체를 생성하여 Log를 출력할 수 있습니다. Logger#log(level, message) 처럼 인자를 전달합니다.

import java.util.logging.Level;
import java.util.logging.Logger;

public class LoggingExample1 {

    private static Logger logger = Logger.getLogger(LoggingExample1.class.getName());

    public static void main(String[] args) {

        logger.log(Level.WARNING, "Warning logging");
        logger.log(Level.INFO, "Info logging");
        logger.log(Level.SEVERE, "Severe logging");
    }
}

Output:

Jun 12, 2021 3:04:45 PM LoggingExample1 main
WARNING: Warning logging
Jun 12, 2021 3:04:46 PM LoggingExample1 main
INFO: Info logging
Jun 12, 2021 3:04:46 PM LoggingExample1 main
SEVERE: Severe logging

Level 인자 없이 Log 출력

Level 인자 없이 warning(), info() 등의 메소드를 이용하여 로그를 출력할 수 있습니다. 결과는 위와 동일합니다.

import java.util.logging.Logger;

public class LoggingExample2 {

    private static Logger logger = Logger.getLogger(LoggingExample2.class.getName());

    public static void main(String[] args) {

        logger.warning("Warning logging");
        logger.info("Info logging");
        logger.severe("Severe logging");
    }
}

Output:

Jun 12, 2021 3:06:19 PM LoggingExample2 main
WARNING: Warning logging
Jun 12, 2021 3:06:19 PM LoggingExample2 main
INFO: Info logging
Jun 12, 2021 3:06:19 PM LoggingExample2 main
SEVERE: Severe logging

Logger#setLevel()

setLevel(Level)으로 특정 Level 이상의 로그들만 출력하도록 만들 수 있습니다.

다음과 같은 로그 레벨들이 있습니다. Severe가 가장 높고, Finest가 가장 낮은 로그 레벨입니다.

  • SEVERE (highest value)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST (lowest value)

Log Level에 대한 자세한 내용은 Oracle - Logger Level를 참고해주세요.

예를 들어, 아래 코드처럼 setLevel(Level.WARNING)으로 레벨을 설정하면, WARNING 이상의 로그만 출력이 됩니다. 즉, WARNING, SEVERE 레벨의 로그는 출력되고, INFO 로그는 출력되지 않습니다.

import java.util.logging.Level;
import java.util.logging.Logger;

public class LoggingExample5 {

    private static Logger logger = Logger.getLogger(LoggingExample5.class.getName());

    public static void main(String[] args) {

        logger.setLevel(Level.WARNING);

        logger.warning("Warning logging");
        logger.info("Info logging");
        logger.severe("Severe logging");
    }
}

Output:

Jun 12, 2021 3:08:33 PM LoggingExample5 main
WARNING: Warning logging
Jun 12, 2021 3:08:33 PM LoggingExample5 main
SEVERE: Severe logging

Log Format 변경

기본적으로 출력되는 로그 형식이 마음에 들지 않는다면, Format을 변경할 수 있습니다.

로그 형식의 로그를 출력하려면 Handler를 등록해야 합니다. 기본으로 등록된 Handler를 삭제하지 않으면 두가지 형식의 로그가 모두 출력되기 때문에, 먼저 기본 Handler를 삭제하고 새로운 Handler를 등록해야 합니다.

아래와 같이 Fommater를 구현하여 Handler를 등록할 수 있습니다.

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.*;

public class LoggingExample3 {

    private static Logger logger = Logger.getLogger(LoggingExample3.class.getName());

    public static void main(String[] args) {
        // remove default log handler
        logger.setUseParentHandlers(false);

        // add new log handler
        Handler handler = new ConsoleHandler();
        handler.setFormatter(new MyLogFormatter());
        logger.addHandler(handler);

        // logging
        logger.warning("Warning logging");
        logger.info("Info logging");
    }

    public static class MyLogFormatter extends Formatter {

        @Override
        public String format(LogRecord record) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            Date date = new Date(record.getMillis());

            StringBuffer sb = new StringBuffer(1000);
            sb.append(dateFormat.format(date));
            sb.append(" [");
            sb.append(record.getLevel());
            sb.append("] ");
            sb.append(record.getMessage());
            sb.append("\n");
            return sb.toString();
        }
    }
}

Output:

2021-06-12 15:12 [WARNING] Warning logging
2021-06-12 15:12 [INFO] Info logging

Log Format 변경 (2)

익명 객체와 String#format()을 이용하여 구현한 예제입니다.

import java.util.Date;
import java.util.logging.*;

public class LoggingExample4 {

    private static Logger logger = Logger.getLogger(LoggingExample4.class.getName());

    public static void main(String[] args) {
        // remove default log handler
        logger.setUseParentHandlers(false);

        // add new log handler
        Handler handler = new ConsoleHandler();
        handler.setFormatter(new SimpleFormatter() {
            private static final String format = "[%1$tF %1$tT] [%2$-7s] %3$s %n";

            @Override
            public synchronized String format(LogRecord lr) {
                return String.format(format,
                        new Date(lr.getMillis()),
                        lr.getLevel().getLocalizedName(),
                        lr.getMessage()
                );
            }
        });
        logger.addHandler(handler);

        // logging
        logger.warning("Warning logging");
        logger.info("Info logging");
    }

}

Output:

[2021-06-12 15:14:31] [WARNING] Warning logging
[2021-06-12 15:14:31] [INFO   ] Info logging

References

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha