2015-02-17 62 views
2

我正在從AnyPoint Studio運行鍼對Mule應用程序的測試,並使用JUnit編寫測試代碼。我需要能夠很好地將日誌數據捕獲到每個測試日誌文件中...Mule ESB和Log 4J2路由附加器

我創建了一個路由附加程序,它可以很好地用於直接測試我們的日誌記錄組件(使用AnyPoint 5.0附帶的log4j2。 1)。

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration xmlns:xi="http://www.w3.org/2001/XInclude"> 
    <properties> 
     <property name="MULE_HOME">E:/</property> 
     <property name="APP_NAME">A_MULE_APP</property> 
    </properties> 

    <Appenders> 
     <Console name="stdout" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" /> 
     </Console> 
     <RollingFile name="MyLog2" 
      fileName="${MULE_HOME}/logs/applogs/LOG-${A_MULE_APP}.log" 
      filePattern="${MULE_HOME}/logs/applogs/LOG-${A_MULE_APP}_%d{yyyyMMdd}.log"> 
      <PatternLayout pattern="%m%n" /> 
      <Policies> 
       <TimeBasedTriggeringPolicy /> 
      </Policies> 
     </RollingFile>  
     <!-- Messages from standard java or mule logging --> 
     <RollingFile name="other" 
      fileName="${MULE_HOME}/logs/applogs/SYS-${A_MULE_APP}.log" 
      filePattern="${MULE_HOME}/logs/applogs/SYS-${A_MULE_APP}_%d{yyyyMMdd}.log"> 
      <PatternLayout pattern="%-5p %d [%t] %c: %m%n" /> 
      <Policies> 
       <TimeBasedTriggeringPolicy /> 
      </Policies> 
     </RollingFile> 
     <Routing name="RoutingAppender"> 
      <Routes pattern="$${ctx:filename}"> 
       <Route> 
        <File name="File" 
         fileName="${ctx:filename}" 
         filePattern="${ctx:filename}.%i.log.gz"> 
         <PatternLayout pattern="%m%n" /> 
         <Policies> 
          <TimeBasedTriggeringPolicy /> 
         </Policies> 
        </File> 
       </Route> 
       <Route ref="MyLog2" key="${ctx:filename}"/> 
      </Routes> 
     </Routing>  
    </Appenders> 
    <Loggers> 
     <Logger name="com.mylogging" level="INFO" additivity="false"> 
      <AppenderRef ref="stdout" /> 
      <AppenderRef ref="RoutingAppender" />    
     </Logger> 
     <Root level="INFO"> 
      <AppenderRef ref="stdout" /> 
      <AppenderRef ref="other" /> 
     </Root> 
    </Loggers> 
</Configuration> 

在我的測試代碼中,我使用

ThreadContext.put("ctx", "filename"); 

如果我所說的記錄儀從我的測試代碼

logger.info("this is some info"); 

然後將正確的信息發送到正確的文件..卜什麼我需要的是我們的日誌組件將這些信息寫入文件..

感謝您的任何幫助!

+0

聽起來像您的解決方案工作。你是否說你不想進行任何日誌配置的測試(比如ThreadContext屬性)? – rewolf 2015-02-19 00:26:55

+0

嗨!感謝您的迴應,是的,從AnyPoint Studio開始,只要MULE應用程序沒有啓動,它就會工作。一旦發生這種情況,ThreadContext對於正在運行的應用程序無效......我確實有一個解決方案,儘管... – thomas 2015-02-19 19:23:13

+0

我在log4j2 xml中創建了兩個附加屬性,稱爲logfile和logfiledirectory,然後將xml加載到一個DOM - 用我想要的那些替換這些值,然後重新加載log4j2.xml謝謝! – thomas 2015-02-19 19:24:04

回答

0

是否有什麼原因需要您在文件中捕獲測試日誌?

內存中的字符串不夠嗎?您可以在每個單獨的測試中爲您的記錄器創建一個自定義的Appender,寫入一個StringBuffer,然後對結果字符串運行斷言。

您將需要創建自己的自定義Appender。 You can see how to do that here。之後,您可以編寫如下測試:

public void testBlaBla() { 
    StringAppender a = createAppenderForTest("com.some.package.Class"); 
    objectToTest.methodThatDoesLogging(); 
    assertEquals(EXPECTED_LOG_LINE, a.getOutput()); 
} 
public void createAppenderForTest(String loggerName) { 
    StringAppender appender = StringAppender.createStringAppender(PATTERN); 
    appender.addToLogger(loggerName, Level.INFO); 
    appender.start(); 
}