사용자 도구

사이트 도구


java:slf4j

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:slf4j [2017/06/23 08:49]
kwon37xi
java:slf4j [2023/12/07 10:32] (현재)
kwon37xi [Test Slf4j - Reflection 사용]
줄 4: 줄 4:
   * Jakarta Commons Logging 과 비슷한 기능을 하지만 Slf4j가 더 좋다.   * Jakarta Commons Logging 과 비슷한 기능을 하지만 Slf4j가 더 좋다.
   * [[java:logback|Logback]]과 조합해서 많이 사용한다.   * [[java:logback|Logback]]과 조합해서 많이 사용한다.
-  * [[http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html|SimpleLogger]] 로거 사용하기 싫을 때 쓸만한 기본 구현체 
  
 ===== 의존성 ===== ===== 의존성 =====
   * ''org.slf4j:slf4j-simple''에 의존성을 걸면 최소한의 slf4j simple logger가 활성화된다.   * ''org.slf4j:slf4j-simple''에 의존성을 걸면 최소한의 slf4j simple logger가 활성화된다.
   * ''org.slf4j:slf4j-api''만 의존성 걸면 아무 logger도 작동하지 않는다.   * ''org.slf4j:slf4j-api''만 의존성 걸면 아무 logger도 작동하지 않는다.
 +
 +===== 로거 객체 생성 =====
 +<code java>
 +// 자동으로 현재 클래스를 찾아낸다.
 +import java.lang.invoke.MethodHandles;
 +
 +private static final Logger logger = 
 +  LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 +</code>
  
 ===== Eclipse Slf4j Template ===== ===== Eclipse Slf4j Template =====
줄 29: 줄 37:
  
 {{:java:idea_slf4j_live_template.png}} {{:java:idea_slf4j_live_template.png}}
 +
 ===== Legacy Logging Framework 제거하고 LogBack 사용 ===== ===== Legacy Logging Framework 제거하고 LogBack 사용 =====
   * http://www.slf4j.org/legacy.html   * http://www.slf4j.org/legacy.html
줄 57: 줄 66:
         configuration.exclude group: 'commons-logging', module: 'commons-logging'         configuration.exclude group: 'commons-logging', module: 'commons-logging'
         configuration.exclude group: 'log4j', module: 'log4j'         configuration.exclude group: 'log4j', module: 'log4j'
 +        configuration.exclude group: 'org.apache.logging.log4j'
         configuration.exclude group: 'org.slf4j', module: 'slf4j-log4j12'         configuration.exclude group: 'org.slf4j', module: 'slf4j-log4j12'
         configuration.exclude group: 'org.slf4j', module: 'slf4j-jcl'         configuration.exclude group: 'org.slf4j', module: 'slf4j-jcl'
줄 95: 줄 105:
 </dependency> </dependency>
 </code> </code>
- 
  
 ==== java.util.logging ==== ==== java.util.logging ====
   * http://www.slf4j.org/legacy.html   * http://www.slf4j.org/legacy.html
   * [[http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j|jul-to-slf4j]] 의존성 걸기   * [[http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j|jul-to-slf4j]] 의존성 걸기
 +  * [[springframework:springboot|SpringBoot]] 사용시 ''jul-to-slf4j'' 의존성이 걸려 있으면 아래 모든 설정이 자동으로 이뤄지므로 할 필요 없다. [[https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/Slf4JLoggingSystem.java|Slf4JLoggingSystem.java]] 참조
 +
 +=== SLF4JBridgeHandler 설정 ===
   * [[http://www.slf4j.org/api/org/slf4j/bridge/SLF4JBridgeHandler.html|SLF4JBridgeHandler]]   * [[http://www.slf4j.org/api/org/slf4j/bridge/SLF4JBridgeHandler.html|SLF4JBridgeHandler]]
     * 애플리케이션 시작 지점에 코드로 설정<code java>     * 애플리케이션 시작 지점에 코드로 설정<code java>
줄 109: 줄 121:
  SLF4JBridgeHandler.install();  SLF4JBridgeHandler.install();
 </code> </code>
-  * ''logging.properties''로 설정<code properties>+  * ''logging.properties''로 설정 (''SLF4JBridgeHandler.install()'' 이거 안할경우에 만)<code properties>
 handlers = org.slf4j.bridge.SLF4JBridgeHandler handlers = org.slf4j.bridge.SLF4JBridgeHandler
 </code> </code>
-  * logback 설정 ''LevelChangePropagator'' 필요(http://logback.qos.ch/manual/configuration.html)+=== Logback 설정 === 
 +  * ''LevelChangePropagator'' 필요(http://logback.qos.ch/manual/configuration.html)
     * groovy 설정<code groovy>     * groovy 설정<code groovy>
 import ch.qos.logback.classic.jul.LevelChangePropagator import ch.qos.logback.classic.jul.LevelChangePropagator
줄 144: 줄 157:
 } }
 </code> </code>
 +
 +===== Marker =====
 +<code java>
 +Marker marker = MarkerFactory.getMarker("markerName");
 +</code>
 +
 +  * [[https://examples.javacodegeeks.com/enterprise-java/slf4j/slf4j-markers-example/|SLF4J markers example]]
 +
 +===== SimpleLogger =====
 +  * [[http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html|SimpleLogger]] 로거 사용하기 싫을 때 쓸만한 기본 구현체
 +<code java>
 +// 버전에 따라 프라퍼티 명이 simpleLogger가 아닌 simplelogger일 수도 있음.
 +// 버전에 따라 defaultLogLevel -> defaultlog 일 수도 있음.
 +System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "info"); // 기본 레젤 지정
 +System.setProperty("org.slf4j.simpleLogger.log.com.microsoft.sqlserver", "trace"); // 특정 logger의 레벨 지정
 +</code>
 +
 +===== Test Slf4j - Reflection 사용 =====
 +  * [[java:reflection|Java Reflection]] 에서 ''private static final'' 필드에 관한 사항 참조
 +
 +<code java>
 +TestTargetClass testTarget = new TestTarget();
 +
 +private Field logField;
 +private Logger originalLogger;
 +private Logger mockedLogger;
 +
 +@BeforeEach
 +void setUp() throws NoSuchFieldException, IllegalAccessException {
 +    mockedLogger = mock(Logger.class);
 +
 +    Field logField = TestTargetClass.class.getDeclaredField("log");
 +    logField.setAccessible(true);
 +
 +    Field modifiersField = Field.class.getDeclaredField("modifiers");
 +    modifiersField.setAccessible(true);
 +    modifiersField.setInt(logField, logField.getModifiers() & ~Modifier.FINAL);
 +
 +    originalLogger = (Logger) logField.get(null);
 +    logField.set(null, mockedLogger);
 +}
 +
 +@AfterEach
 +void tearDown() throws IllegalAccessException {
 +    logField.set(null, originalLogger);
 +}
 +
 +
 +@Test
 +void testMethod() {
 +    testTarget.callMethod()
 +
 +    verify(mockedLogger).info("로그 메시지. 로그 인자 {}", "로그인자");
 +
 +}
 +
 +// Lombok @Slf4j 로 private static final Logger log 필드 주입
 +@Slf4j
 +public static class TestTargetClass {
 +    public void callMethod() {
 +        log.info("로그 메시지. 로그 인자 {}", "로그 인자");
 +    }
 +}
 +</code>
 +
 +
 +===== Test Slf4j =====
 +  * [[https://www.simplify4u.org/slf4j-mock/|SLF4J mock]] : slf4j 2.x 까지 반영된 최신 라이브러리
 +  * [[http://projects.lidalia.org.uk/slf4j-test/|SLF4J Test]]
 +  * [[https://github.com/portingle/slf4jtesting|portingle/slf4jtesting: SLF4J Testing library optimised for test concurrency and dependency injection]]
 +  * http://www.spf4j.org/spf4j-slf4j-test/index.html
 +
 +===== 참조 =====
 +  * [[https://examples.javacodegeeks.com/enterprise-java/slf4j/slf4j-tutorial-beginners/|SLF4J Tutorial for Beginners | Examples Java Code Geeks - 2018]]
 +
java/slf4j.1498177166.txt.gz · 마지막으로 수정됨: 2017/06/23 08:49 저자 kwon37xi