본문 바로가기

Java

[JAVA Logging] SLF4J(Simple Logging Facade for Java)란 무엇일까

반응형
  • Simple Logging Facade for Java의 약자로 로깅 프레임워크(ex: logback, log4j)에 대해 추상화 역할을 합니다.
  • 최종 배포 시 사용자가 원하는 로깅 프레임워크로 배포할 수 있게 되는데
  • Facade에서 의미를 찾을 수 있습니다.

 

  • 소프트웨어 공학 디자인 패턴에서는 크게 생성, 구조, 행위 패턴으로 나눌 수 있는데,
  • Facade Pattern은 그 중 구조패턴에 속합니다.

 

https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%82%AC%EB%93%9C_%ED%8C%A8%ED%84%B4#/media/%ED%8C%8C%EC%9D%BC:UML_DP_Fa%C3%A7ade.png

  • Facade Pattern 특징
  • 서브 클래스들의 기능들을 미리 구현해놓고, 상위의 인터페이스를 제공함으로써 복잡한 로직을 알 필요가 없어진다.
  • 인터페이스에만 접근하면 되므로 사용성이 용이하고, 사용자 또는 시스템끼리의 결합도를 낮춰 의존성이 감소된다.
  • 따라서, 시스템의 복잡성을 감추고, 사용자가 시스템에 접근할 수 있는 인터페이스를 제공하는 것에 목적을 둔다.

 

 

/* 출처 : https://ko.wikipedia.org/wiki/퍼사드_패턴 */
/* Complex parts */

class CPU {
	public void freeze() { ... }
	public void jump(long position) { ... }
	public void execute() { ... }
}

class Memory {
	public void load(long position, byte[] data) {
		...
	}
}

class HardDrive {
	public byte[] read(long lba, int size) {
		...
	}
}

/* Façade */

class Computer {
	public void startComputer() {
        CPU cpu = new CPU();
        Memory memory = new Memory();
        HardDrive hardDrive = new HardDrive();
		cpu.freeze();
		memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
		cpu.jump(BOOT_ADDRESS);
		cpu.execute();
	}
}

/* Client */

class You {
	public static void main(String[] args) throws ParseException {
		Computer facade = /* grab a facade instance */;
		facade.startComputer();
	}
}
  • 위키피디아에 기재된 JAVA 소스 예제를 살펴보면
  • CPU, Memory, HardDrive -> 서브 클래스
  • Computer -> Facade Interface
  • 컴퓨터 내부 부품에 대한 서브 클래스들이 선언되어 있고, Facade startComputer() 에서 상세 로직이 기재된 걸 볼 수 있습니다.
  • 컴퓨터 부품을 조립 또는 환경 구성을 한다고 가정을 한다면 순서와 해당 부품을 이용한 방법 등이 중요할 것입니다.
  • 하지만, 사용자인 우리는 Computer의 startComputer() 을 호출한다면 순서, 방법 등과 관계없이 Computer을 구성할 수 있습니다.
  • 이처럼 우리는 복잡한 내부 로직을 알 필요 없이 인터페이스 호출로 간단하게 사용할 수 있게 됩니다.

 

  • SLF4J는 java.util.logging, logback, log4j을 사용할 수 있는 인터페이스 역할을 해줍니다.
  • 하지만, SLF4J 추상화된 프레임워크이기 때문에 단일 사용으로는 동작하지 않습니다.
  • 구현되어 있는 log library를 사용해 logging 작업을 동작해줍니다. (연결해주는 브릿지 역할을 해준다 생각하면 되겠습니다.)
  • 따라서, SLF4J는 단일 사용이 아닌 logback, log4j 등과 같이 사용해줍니다.

 

  • 그렇다면 SLF4J를 사용할게 아니라 log4j만 사용하면 되지 않냐 생각할 수 있는데,
  • 최근 log4j의 보안 취약점 이슈를 예로 들어보자면
  • 보안 취약점이 발견된 log4j의 버전을 사용하고 있을 경우 조치 방안에 따라 버전을 변경해줘야 했습니다.
  • 하지만, 지속해서 취약점이 발견되고 있는 상황에서 log4j의 사용을 지속하기 어렵다 판단이 된다면 다른 log library로 변경을 해줘야 하는데
  • 이럴 경우 SLF4J를 사용하고 있었다면 설정 파일 변경(ex: pom.xml maven dependency 수정) 하나로 수정이 용이하다는 것입니다.

 

  • 보통 log4j를 사용한다 하면 java 소스들에
    import org.apache.log4j.Logger
    Logger log = Logger.getLogger(This.getClass));
    log.info("로그");
  • 이런 식으로 import가 됐을텐데, 일일히 import 제거해주고, 새로 import 시켜주고 하는 작업이 줄어들 수 있는겁니다.
  • 필요에 따라 SLF4J로 마이그레이션(log4j -> SLF4J)하는 방법도 있습니다.

 

 

https://www.slf4j.org/manual.html#swapping

  • 한가지 유의해야할 점을 알려드리자면
  • 메뉴얼 > Binding with a logging framework at deployment time 문단을 보시면 binding 메뉴얼이 있습니다.
  • one and only one binding 라는 문구가 강조되어 있는데
  • SLF4J 사용 시 여러 logging library 사용할 수 없고, 하나만 사용하게 되어있습니다.

 

  • 사용 메뉴얼, FAQ, SLF4J로 마이그레이션 하는 방법 등이 기재되어 있으니 SLF4J의 공식 문서 참고해보시길 바랍니다.

 

https://www.slf4j.org/

 

SLF4J

Simple Logging Facade for Java (SLF4J) The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framewor

www.slf4j.org

 

https://www.slf4j.org/manual.html

 

SLF4J Manual

SLF4J user manual The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks, such as java.util.logging, logback and reload4j. SLF4J allows the end-user to plug in the desired logging framework at dep

www.slf4j.org

 

반응형