slf4j + logback 환경에서 이니지스 결재 모듈(INIpay50.jar) 사용 시 이니시스 로깅에 문제가 발생한다.


이니시스측에서도 log4j 를 사용하라고 권고한 상황..


하지만 쓰고 싶다면...


'org.slf4j:log4j-over-slf4j' 부분을 exclude 하면 된다.



※ 'org.slf4j:log4j-over-slf4j' 는 기존 라이브러리가 log4j를 사용하고 있을때, slf4j로 넘겨주는 역할은 하는거란다.


최근에 Logback 로깅 라이브러리에 대해서 알게되었다.

검색 시 많은 자료가 나오는것을 보니 단순 트랜드가 아닌 현재 실무에서도 많이들 사용하는듯 싶습니다.


우선 Log4j,SLF4J를 만든 사람이 만들었다니 더 좋을 수밖에 없다는 생각이듭니다.

(맘에 안들고 불편했던 부분을 개선하고, 여러 실무 의견들을 반영했을 테니까요.)


좋은점에 대한 정보가 많이 있었으나 우선 제 시점에서 좋겠구나 하는것만 나열 하겠고, 나머지는 직접 검색해보시기 바랍니다.(자료 많네요.)


첫째로, 성능이 약 10배 향상, 메모리 점유율도 낮아졌음

우선 메모리야 요즘 넘처나기도 하고, 현재까지 Log4j 사용하면서 메모리 문제는 없었던 상황이니 잘 와닫지 않고, 모바일 기기의 출현으로 0.01 초의 차이도 의미 있는 수치일수 있으므로 성능 향상은 아주 좋은 장점인것 같습니다.


둘째로, 설정파일 자동으로 Reloading

간혹 개발 및 스테이지에서는 확인이 안되고 운영상황에서만 문제가 발생할때 DEBUG모드로 변경후 모니터링 해봐야 하는 경우가 있습니다.

이럴때 Log4j는 서버를 재기동해야 하는 부담이 있는데 Logback을 사용하므로 인해서 부담이 줄겠네요.


세번째로, "logback-access" 라고 HTTP 디버깅

웹개발자로서 무슨소린지 몰라도 유용할듯 싶은데... 셈플링 해봐야할것 같네요.


네번째로, 자동삭제

서버관리상의 기능이긴 하지만 유용한 기능인것 같습니다.

굳이 배치나 주기적으로 삭제관련 모니터링을 하지 않아도 되니까요.


다섯째로, Prudent mode

다수의 JVM일 경우 하나의 파일에 쌓을수 있다는데..

한장비안에서 쌓을 일은 없을듯 하고, 별도의 장비에서 동일한 NAS경로 셋팅되어 있어도 가능한지 모르것네;;


여섯째로, 분기 스트립트 작성

if,else 와 같은 문법 사용이 가능하므로, 개발, 스테이지, 운영에 따른 처리가 한 파일로 가능하겠군요.

기존에는 파일을 각각 두어서 시스템프로퍼티에 해당 정보를 셋팅해서 선택하게끔 하거나, 배포시 파일명을 변경하곤 하였는데 말이죠. ㅎㅎ


일곱째로, 특정 분류별 로그파일 기록

특정 사용자별로 하고 싶은데.. 가능하려나 모르것네..


여덜째로, Stack Trace 출력

외부 라이브러리에서 발생한 Exception에 대해서 참조되는 라이브러리 버전까지 출력을 해준다네..

전에 버전이 틀린 동일한 라이브라리가 두개 올라가져 있어서 개발,스테이지,운영간에 두개중 참조하는게 틀려서 한참 삽질 했던적 있는데 그러한경우 디버깅이 그나마 쉬워지겠군요.



우선 간단한 셈플링부터.. 나머지는 차차차~


[build.gradle]

apply plugin: 'java'
apply plugin: 'eclipse'

sourceCompatibility = 1.6

repositories {
    mavenCentral()
}


// SLF4J + Logback
List loggerSlf4jAndLogback = [
    "ch.qos.logback:logback-classic:1.0.13",
    "org.slf4j:jcl-over-slf4j:1.7.5"
]

dependencies {
    compile loggerSlf4jAndLogback
}

// commons-logging 의존성 제거
configurations {
    all.collect { configuration ->
        configuration.exclude group: 'commons-logging', module: 'commons-logging'
        configuration.exclude group: 'log4j', module: 'log4j'
    }
}


[logback.xml]



	
		
			%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
		
	

	
		
	


[Foo.java]

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Foo {
	static final Logger logger = LoggerFactory.getLogger(Foo.class);

	public void doIt() {
		logger.debug("안녕 {}", "하세요.");
	}
}


+ Recent posts