Java의 로그 남기기 - 🐥 카카오 테크 캠퍼스
Java 로깅은 애플리케이션 런타임 동안 로그 메시지를 기록하고 저장하는 데 사용되는 메커니즘입니다.
로깅의 주요 목적은 개발자가 응용 프로그램에서 발생할 수 있는 문제를 식별할 수 있는 방법을 제공하고 디버깅 및 성능 조정을 지원하는 것입니다.
Java는 개발자가 콘솔이나 파일과 같은 다른 대상에 메시지를 기록할 수 있는 java.util.logging이라는 기본 제공 로깅 패키지를 제공합니다.
또한 로깅 패키지는 SEVERE, WARNING, INFO, CONFIG, FINE, FINER 및 FINEST를 비롯한 여러 가지 로깅 수준을 제공합니다.
이러한 수준은 메시지의 심각도를 나타내며 기록되는 메시지를 결정합니다.
Logger 생성
Java에서 로거를 생성하려면 java.util.logging.Logger 클래스에서 제공하는 getLogger() 메서드를 사용해야 합니다.
로거를 만든 후에는 log() 메서드를 사용하여 메시지를 다른 대상에 기록할 수 있습니다
코드를 쪼개서 설명하는게 가독성이 좋을거 같아 흐름에 따라 나눠 설명하겠습니다
// Import the logging package import java.util.logging.*; // Define a class called MyLogger public class MyLogger { // Get a logger instance with the name "mylogger" // 로거 인스턴스를 생성합니다 Logger logger = Logger.getLogger("mylogger"); // Create a private instance of MyLogger private static MyLogger instance = new MyLogger();
MyLogger는 [[싱글톤]] 패턴을 사용하기 때문에 private static MyLogger instance = new MyLogger();
와 같이 선언합니다
변수 instance는 getLogger를 통해 다른 클래스에서 액세스 할 수 있는 MyLogger 클래스의 단일 인스턴스 유지를 위해 새성되었습니다
인스턴스는 클래스가 JVM에 로드될 때 한 번만 생성되며 이후 getLogger()
호출은 항상 동일한 인스턴스를 반환합니다.
// Set the log file paths public static final String errorLog = "log.txt"; public static final String warningLog = "warning.txt"; public static final String fineLog = "fine.txt"; // Create file handlers for each log file private FileHandler logFile = null; private FileHandler warningFile = null; private FileHandler fineFile = null; // Private constructor for MyLogger private MyLogger(){
위 코드는 “log.txt”, “warning.txt” 및 "fine.txt"라는 세 개의 로그 파일 이름을 상수로 정의합니다.
그런 다음 각 로그 파일에 대해 logFile
, warningFile
및 fineFile
의 세 가지 FileHandler
인스턴스를 생성합니다.
각 로그 파일의 FileHandler 인스턴스는 전용 인스턴스 변수로 생성되므로 MyLogger 클래스 내에서만 액세스할 수 있습니다.
즉 로거의 구현 세부 사항을 캡슐화하고 코드의 다른 부분이 로그 파일을 직접 수정하지 못하도록 방지하기 위해 수행됩니다.
마지막으로 MyLogger
클래스의 전용 생성자를 정의합니다.
// Try to create a file handler for each log file try { logFile = new FileHandler(errorLog, true); warningFile = new FileHandler(warningLog, true); fineFile = new FileHandler(fineLog, true); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // Set the formatter for each file handler logFile.setFormatter(new SimpleFormatter()); warningFile.setFormatter(new SimpleFormatter()); fineFile.setFormatter(new SimpleFormatter()); // Set the logger level and file handler levels logger.setLevel(Level.ALL); fineFile.setLevel(Level.FINE); warningFile.setLevel(Level.WARNING); // Add the file handlers to the logger logger.addHandler(logFile); logger.addHandler(warningFile); logger.addHandler(fineFile); }
위의 코드에서는 앞에서 지정한 각 로그 파일에 대해서 하나씩 파일 처리기를 만듭니다.
각 파일 핸들러는 각각의 파일에 로그 메세지를 쓰는데 사용됩니다
파일 핸들러를 만든 후 코드는 로그 메시지를 읽을 수 있는 텍스트 형식으로 포맷하는 SimpleFormatter를 사용하도록 각 파일 핸들러의 포맷터를 설정합니다.
다음으로 코드는 로거 수준을 Level.ALL로 설정합니다.
즉, 모든 수준의 모든 로그 메시지가 기록됩니다.
그런 다음 fineFile 및 warningFile 처리기의 수준을 각각 Level.FINE 및 Level.WARNING으로 설정합니다.
즉, 해당 수준 이상의 로그 메시지만 기록됩니다.
마지막으로 코드는 로그 메시지가 해당 파일에 기록될 수 있도록 3개의 파일 처리기를 모두 로거에 추가합니다.
// Get the instance of MyLogger public static MyLogger getLogger(){ return instance; } // Log a message at all levels 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); } // Log a message at the FINE level public void fine(String msg){ logger.fine(msg); } // Log a message at the WARNING level public void warning(String msg){ logger.warning(msg); } }
getLogger() 메서드는 싱글톤 인스턴스인 MyLogger 클래스의 인스턴스를 반환합니다.
log() 메서드는 모든 로깅 수준(최상, 미세, 미세, 구성, 정보, 경고 및 심각)에서 메시지를 기록합니다.
fine() 메서드는 FINE 수준에서 메시지를 기록하고 warning() 메서드는 WARNING 수준에서 메시지를 기록합니다.
이러한 메서드는 모두 MyLogger 생성자에서 생성된 로거 인스턴스를 사용하여 적절한 로그 파일에 메시지를 기록합니다.
마지막으로 우리가 만든 로거를 사용하려면 코드 흐름에서 인스턴스를 만들고 log() 메소드를 호출하여 메시지를 기록 할 수 있습니다
public class LoggerTest { public static void main(String[] args) { MyLogger myLogger = MyLogger.getLogger(); myLogger.log("test"); } }
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Java' 카테고리의 다른 글
Java의 바이트 단위 입출력 - 🐥 카카오 테크 캠퍼스 (0) | 2023.05.03 |
---|---|
Java의 입출력 스트림 - 🐥 카카오 테크 캠퍼스 (0) | 2023.05.03 |
Java의 예외처리 - 🐥 카카오 테크 캠퍼스 (0) | 2023.05.03 |
Java의 Reduce - 🐥 카카오 테크 캠퍼스 (0) | 2023.05.02 |
Stream (0) | 2023.05.02 |