2012-05-30 26 views
4

我使用SL4jLogback作爲託管在Tomcat中的Web應用程序。我使用Spring和Maven(沒有配置文件)。用於集成測試的不同日誌文件

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-failsafe-plugin</artifactId> 
    <version>2.12</version> 
    <executions> 
     <execution> 
      <id>integration-test</id> 
      <goals> 
       <goal>integration-test</goal> 
      </goals> 
      <configuration>...</configuration> 
     </execution> 
     <execution> 
      <id>verify</id> 
      <goals> 
       <goal>verify</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

裏面的logback的配置我有一個基於文件的appender:巧合被分隔爲集成測試和web應用程序

<appender name="A2" class="ch.qos.logback.core.FileAppender"> 
    <file>myapp.log</file> 
    ... 

日誌文件:集成測試與神火插件做了集成測試是我的項目的根源,對於webapp,它是Eclipse目錄。所以,我公司推出的的logback配置裏面的日誌文件的位置:在組合

<insertFromJNDI env-entry-name="java:comp/bla/logDir" as="logDir" /> 
<if condition='!isDefined("logDir")'> 
    <then> 
     <property name="logDir" value="${catalina.home}/logs/" /> 
    </then> 
</if> 

ifisDefined作品現在,我忘了JANINO在classpath(感謝Ceki)。集成測試日誌輸出和Web應用程序日誌輸出在同一個日誌文件中。所以我的問題:

我怎樣才能分離集成測試Web應用程序的日誌文件? 我發現這個link,但我更喜歡只有配置的解決方案。我真的很想插入Maven屬性。

更新 我的問題解決了。首先的logback配置:

<configuration scan="true" debug="true"> 
    <!-- used for the production webapp --> 
    <insertFromJNDI env-entry-name="java:comp/bla/logDir" as="logDir" /> 
    <if condition='!isDefined("logDir")'> 
     <then> 
      <if condition='isDefined("catalina.home")'> 
       <then> 
        <!-- used for the development webapp --> 
        <property name="logDir" value="${catalina.home}/logs/" /> 
       </then> 
       <else> 
        <!-- used for the integration test --> 
        <property name="logDir" value="./" /> 
       </else> 
      </if> 
     </then> 
    </if> 

的附加器文件屬性的樣子:

<file>${logDir}/myapp.log</file> 

2東西都在這個解決方案奇怪:

  1. 的logback認爲物業是不確定的,當它是空。所以我不得不使用"./"而不是""(空字符串)。
  2. isDefined("catalina.home")結果true僅當在Tomcat中啓動時(OS是Windows)。不知道爲什麼要定義「catalina.home」,我有一個名爲「CATALINA_HOME」的環境變量,但它接近TomCat在開始時設置「catalina.home」。

我仍然想插入一個Maven var到logback配置文件(項目根目錄),但是恐怕我必須忍受上面的解決方案。

+1

感謝您的更新。 – electrotype

回答

3

條件配置(if語句)需要Janino。 Janino是否可以在你的課程路徑上使用?你是否將debug屬性設置爲true,如下所示?

<configuration debug="true">...</configuration> 

設置調試屬性爲true,將打印的可追查的logback配置問題非常有用的控制檯上的logback的內部狀態信息。

至於分離問題,你認爲按主機名分隔? Logback自動將HOSTNAME定義爲一個變量。因此,以下內容將定義兩個基於productionHost和其他主機的獨立日誌記錄設置。

<if condition='property("HOSTNAME").contains("productionHost")'> 
    <then>...</then> 
    <else>config for test</else> 
</if> 

其實,我不明白爲什麼根據'logDir'的定義分離不足以實現分離。

+0

不知道調試開關,非常有用。是的,我忘了Janino lib。所以我的問題1解決了,謝謝!你有沒有想過從webapp輸出中分離集成測試? – ChrLipp

+1

問題已解決,請參閱更新的問題。實際上,我有3個環境:生產tomcat,開發tomcat,集成測試。現在所有3個工作。謝謝,調試模式幫了大忙! – ChrLipp

0

我建議爲集成測試提供單獨的模塊,您可以在其中放置不同的日誌文件配置(src/test/resources),單元測試的配置將從您放置模塊的模塊單元測試。