MinLog (Java Logging Library)

MinLog는 Nathan Sweet(EsotericSoftware)가 개발한 경량 Java 로깅 라이브러리다. Kryo, KryoNet, libGDX 같은 오픈소스 프로젝트에서 오버헤드를 줄이기 위해 주로 쓰인다.

핵심 특징

  1. 초경량 구조 전체 라이브러리가 com.esotericsoftware.minlog.Log라는 단일 클래스(실제 코드 약 100줄 내외)로 구성되어 있다. 외부 의존성이 전혀 없다.

  2. 제로 오버헤드 (컴파일 타임 최적화) 로그 레벨 필드가 static final boolean으로 선언될 수 있도록 설계되어 있다. 예를 들어 if (Log.DEBUG) Log.debug("..."); 형태로 작성하고 배포 빌드에서 DEBUG를 비활성화하면, Java 컴파일러(javac)나 ProGuard가 해당 조건문과 내부의 문자열 결합 코드를 바이트코드에서 아예 제거(Dead Code Elimination)한다.

  3. 단순한 API 복잡한 설정 파일(XML, JSON, properties)이나 로거 인스턴스 생성 과정이 없다. 정적(static) 메서드를 바로 호출해서 쓴다.

  4. 지원 로그 레벨

    • LEVEL_NONE (로깅 비활성화)
    • LEVEL_ERROR
    • LEVEL_WARN
    • LEVEL_INFO
    • LEVEL_DEBUG
    • LEVEL_TRACE
  5. 커스터마이징 기본적으로 콘솔(System.out)에 경과 시간, 로그 레벨, 카테고리, 메시지를 출력한다. 출력 방식이나 포맷을 바꾸고 싶다면 Log.Logger 클래스를 상속받아 log() 메서드를 오버라이드한 뒤 Log.setLogger()로 등록하면 된다.


기본 사용법

import com.esotericsoftware.minlog.Log;
 
public class Main {
    public static void main(String[] args) {
        // 로그 레벨 설정
        Log.set(Log.LEVEL_DEBUG);
 
        // 일반 로그 출력
        Log.info("서버 시작됨");
 
        // 카테고리 지정 로그 출력
        Log.debug("network", "연결 시도 중...");
 
        // 예외 포함 로그 출력
        try {
            throw new RuntimeException("테스트 예외");
        } catch (Exception e) {
            Log.error("database", "쿼리 실패", e);
        }
 
        // 문자열 연산 오버헤드 방지 패턴
        if (Log.TRACE) {
            Log.trace("system", "상세 데이터: " + System.currentTimeMillis());
        }
    }
}

주요 Java 로깅 라이브러리와의 비교

비교 항목MinLogSLF4J + Logbackjava.util.logging (JUL)
개발 주체EsotericSoftware (Nathan Sweet)QOS.ch (Ceki Gülcü)Oracle / OpenJDK
라이브러리 크기극소형 (단일 클래스, 수 KB)중대형 (수백 KB 이상, 다중 JAR)내장 (JDK 기본 포함)
설정 방식Java 코드 내에서 직접 호출 (Log.set())XML, Groovy, Properties 등 외부 파일Properties 파일 또는 코드
런타임 오버헤드거의 없음 (컴파일러 최적화 가능)낮음 (동적 바인딩 및 Appender 처리 존재)보통
주요 기능콘솔 출력, 기본 레벨 필터링파일 롤링, 비동기 로깅, MDC, 다양한 Appender기본 파일/콘솔 핸들러, 포매터
주 사용처게임 개발(libGDX), 직렬화(Kryo), 안드로이드/임베디드엔터프라이즈 서버, 대규모 웹 애플리케이션외부 의존성을 추가할 수 없는 기본 Java 환경

출처 (Sources)

Entities