2013-01-04 68 views
10

我想要一個log4j.xml配置並能夠在開發我的應用程序時登錄到控制檯。一旦部署到一個環境,我只想登錄到文件appender而不是控制檯。我怎樣才能做到這一點?Log4j,禁用依賴於環境的appenders

這是我目前的配置:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Threshold" value="DEBUG" /> 
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" /> 
     </layout> 
    </appender> 

    <appender name="LogFileAppender" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="${log-base-dir}/${adapter-name}.log" /> 
     <param name="MaxFileSize" value="5000KB" /> 
     <param name="MaxBackupIndex" value="99" /> 
     <param name="append" value="true" />   
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="info" /> 
     <appender-ref ref="ConsoleAppender" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 

</log4j:configuration> 
+0

是你想使用相同的文件,並實現?如果執行測試用例和部署,則可以區分日誌。我認爲你必須手動更改文件。 – VinayVeluri

回答

11

解決的辦法之一可能是log4j的配置文件分離爲發展生產環境如:

  • log4j-development.xml - 發展環境對於生產環境

然後,您的應用程序啓動命令可以有指定log4j配置文件的參數,例如java -Dlog4jconfig=log4j-development.xml -jar Application.jar

您可以通過在您的代碼中獲取log4jconfig屬性值來配置log4j,例如, System.getProperty("log4jconfig")

該解決方案的優點如下:

  • 你可以(在發展ConsoleAppenderLogFileAppender只有在生產LogFileAppender)獨立指定記錄儀
  • 您可以指定每個環境的日誌記錄級別(例如error在生產和debug在開發中)
  • 您可以獨立配置文件記錄器,例如保留日誌X天的生產(用於審計等),並在發展等只有一個日誌文件

這種模式是在你有多個環境(開發,UAT,分期許多應用服務器使用,生產等)

log4j-development.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Threshold" value="DEBUG" /> 
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="debug" /> 
     <appender-ref ref="ConsoleAppender" /> 
    </root> 

</log4j:configuration> 

實施例的log4j-production.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <appender name="LogFileAppender" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="${log-base-dir}/${adapter-name}.log" /> 
     <param name="MaxFileSize" value="5000KB" /> 
     <param name="MaxBackupIndex" value="99" /> 
     <param name="append" value="true" />   
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="error" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 

</log4j:configuration> 
+4

作爲一個變體,你可以在配置文件中引用'log4j.xml',但是有你的構建過程(Maven/Ant),在創建生產JAR時將'log4j-production.xml'複製到'log4j.xml'中。 – AngerClown

+0

我意識到這個解決方案,但我想知道是否有另一種聰明的方式只有一個log4j.zml文件,而不是兩個來滿足我的要求。 – Ash

6

使用appender的Threshold參數和JVM系統屬性很容易。例如。

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Threshold" value="${my.console.level}" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n" /> 
    </layout> 
</appender> 

然後就開始使用PROD -Dmy.console.level=OFF

應用程序時,同時在本地啓動時使用-Dmy.console.level=ALL

兩個OFFALL是有效的log4j的水平。

+0

適合我的作品,避免添加其他log4j文件進行製作,謝謝 – EPerrin95