2012-11-14 63 views
4

我有一個相當簡單的Java應用程序,它作爲可執行JAR文件分發給用戶。爲了跟蹤使用情況並協助診斷,我想爲應用程序添加日誌記錄功能,但從一次執行到下一次執行,我無法確定用戶將在哪裏運行此應用程序。如何在打包時更改log4j配置

爲了做到這一點,我將應用程序配置爲使用log4j套接字appender--無論用戶在哪裏運行此應用程序,郵件都會發送到套接字並正確記錄,這非常完美。

我現在正在運行的是,當我在本地運行時,而不是在將該應用程序部署到生產環境中時,我寧願使用不同的log4j配置。在本地運行時(從我的IDE,IntelliJ),我寧願使用控制檯appender的原因有幾個:

  1. 查看發生了什麼很簡單。
  2. 我應該在沒有互聯網連接的情況下開發,我不想掛斷無法連接。
  3. 我不想在開發過程中混淆生產日誌。

但是,當我打包應用程序並分發它時,我希望它使用套接字appender,而不是控制檯appender。

有沒有簡單的方法來完成我想要的?我正在使用Maven構建我的應用程序,但我對它並不熟練。

+1

你可能想看看在Maven的配置文件的概念(http://maven.apache.org/guides/mini /guide-building-for-different-environments.html),可用於爲不同的配置文件指定不同的資源(如測試,產品等)。 – Vikdor

回答

3

下面是你的問題更簡單的方法...

留兩個log4j.properties文件src/main/resources目錄下,這樣的: -

src/main/resources 
|- log4j.properties 
|- log4j_dev.properties 

log4j.properties包含生產配置,默認情況下,Log4J的會自動選擇這個文件,因爲你使用的是標準文件名。

log4j_dev.properties包含開發配置。爲了確保IntelliJ在開發過程中採用這種方式,您將使用-Dlog4j.configuration=<configuration-file> VM選項覆蓋日誌配置。我重視你如何可以配置此使用的IntelliJ截圖: -

enter image description here

3

我強烈建議讓它在運行時而不是構建時確定。

例如,當您運行應用程序時,請將config/目錄放在類路徑的開頭,然後將log4j.xml放在那裏。當然,您仍然可以在應用程序JAR中保留默認的log4.xml,這樣如果您在部署中不提供它,您的應用程序仍然可以運行。

3

事實證明,這比我最初預計的要簡單 - 維克多的評論讓我得出了正確的答案。我開始挖掘出多個配置文件(一個用於開發,一個用於產品),但後來意識到我並不需要兩個配置文件。在本地工作時,我並沒有真正經歷Maven構建過程 - 我只是在執行Java類。唯一一次我經歷了Maven構建過程的時候,我想要打包我的應用程序進行部署。因此,我只是在使用maven-antrun-plugin的POM文件中添加了一個部分。我最後的代碼最終看上去像這樣:

文件:log4j.properties:

# Set root logger level to DEBUG and its only appender to A1. 
log4j.rootLogger=DEBUG, A1 

# A1 is set to be a ConsoleAppender. 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 

# A1 uses PatternLayout. 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n 

文件:log4j_production.properties

# Set root logger level to DEBUG and its only appender to A1. 
log4j.rootLogger=DEBUG, A2 

log4j.appender.A2=org.apache.log4j.net.SocketAppender 
log4j.appender.A2.remoteHost=my.server.com 
log4j.appender.A2.port=6000 
log4j.appender.A2.layout=org.apache.log4j.PatternLayout 
log4j.appender.A2.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n 

文件:pom.xml的

... 
<build> 
    <finalName>${project.artifactId}</finalName> 
    <plugins> 
     <plugin> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>prepare-package</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <tasks> 
          <delete file="${project.build.outputDirectory}/log4j.properties"/> 
          <copy file="src/main/resources/log4j_production.properties" 
            toFile="${project.build.outputDirectory}/log4j.properties"/> 
         </tasks> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
... 

這似乎是訣竅。當我在本地運行時,我加載了log4j.properties,它給了我一個控制檯appender。當我打包生產發行版時,Maven會用默認的log4j.properties文件替換爲使用套接字appender的替代文件。

謝謝!