2016-10-04 3 views
2

log4j-1.6에서 log4j-2.6으로 작은 테스트 케이스 (예상대로 로깅이 작동하는지 확인)를 마이그레이션하려고합니다. 우리가하고있는 일은 맵을 전달하고 디버그 레벨에서 로깅하고 loggingEvent가 Debug인지 아닌지 확인하고 예상되는 렌더링 된 메시지를 표시하는 것입니다. 우리는 이렇게하고있다Log4j2 로깅 이벤트 받기

final ArgumentCaptor<LoggingEvent> loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class); 

    verify(mockAppender).doAppend(loggingEventCaptor.capture()); 
    final LoggingEvent loggingEvent = loggingEventCaptor.getValue(); 

    assertEquals(Level.DEBUG, loggingEvent.getLevel()); 
    assertEquals("ExpectedMessage", loggingEvent.getRenderedMessage()); 

그러나 appenders 및 loggingEvents가 log4j2에없는 것을 알게되었다. 그러나 나는 이것을 달성 할 길을 찾을 수 없었다. log4j2로 가능합니까?

답변

2

오랜 연구 끝에 나는 이와 같은 문제를 해결했다. 내가 디버그 내 로그 레벨을 설정하고 실제로 펜더를 생성 한 사용자 정의 펜더를 쓰고 설정하고 메시지

@Plugin(name = "TestAppender", category = "Core", elementType = "apender", printObject = true) 
public class TestAppender extends AbstractAppender { 

    private List<String> messages = new ArrayList<String>(); 

    protected TestAppender(String name, Filter filter, Layout<? extends Serializable> layout) { 
     super(name, filter, layout); 
    } 

    @Override 
    public void append(LogEvent event) { 
     getMessages().add(event.getMessage().toString()); 
    } 

    public static TestAppender createAppender(@PluginAttribute("name") String name, 
      @PluginElement("Layout") Layout<? extends Serializable> layout, 
      @PluginElement("Filter") final Filter filter, 
      @PluginAttribute("otherAttribute") String otherAttribute) { 
     if (name == null) { 
      LOGGER.error("No name provided for TestAppender"); 
      return null; 
     } 
     if (layout == null) { 
      layout = PatternLayout.createDefaultLayout(); 
     } 
     return new TestAppender(name, filter, layout); 
    } 

    public List<String> getMessages() { 
     return messages; 
    } 

    public void setMessages(List<String> messages) { 
     this.messages = messages; 
    }  
} 
를 기록 얻을 여기

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration package="log4j.test" status="WARN"> 
<Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
</Appenders> 
<Loggers> 
    <Logger name="log4j.test.Log4jTest" level="debug"> 
     <AppenderRef ref="Console"/> 
    </Logger> 
    <Root level="debug"> 
     <AppenderRef ref="Console"/> 
    </Root> 
</Loggers> 
</Configuration> 

의 src 싶습에 TST 및 특성 파일에 사용자 정의 펜더를 추가

내 실제 시험에서, 나는 초기화 설정 방법

@Before 
    public void setUp() { 
     org.apache.logging.log4j.core.Logger logger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger(); 
     PatternLayout layout = PatternLayout.createLayout("%d{HH:mm:ss.SSS} [%t] %-5level %logger{1} - %msg%n%ex", 
       null, null, null, Charset.forName("GBK"), false, true, null, null); 
     testAppender = TestAppender.createAppender("TestAppender", layout, null, "true"); 
     testAppender.start(); 
     logger.getContext().getConfiguration().addLoggerAppender(logger, testAppender); 
    } 

의 펜더를 부착하고이 방법을 주장했다.

assertEquals(Level.DEBUG, LogManager.getRootLogger().getLevel()); 
    assertEquals(
      "[Request headers: [{key: one, values: [one1, one2]}, {key: two, values: []}, {key: three, values: [three]}]]", 
      testAppender.getMessages().toString()); 

이것은 긴 절차입니다. 그러나 그것은 나를 위해 일했습니다. 오랜 연구 끝에 나는 이것을 생각해 냈다. 나는 이것이 있으면 더 쉽게 그리고 더 쉬운 방법을 찾고 있습니다.

참고 : 본인의 목적에 따라 다양한 블로그에서이 코드를 복사했습니다.