簡體   English   中英

打包時如何更改log4j配置

[英]How to Change log4j Configuration When Packaging

我有一個相當簡單的Java應用程序,它以可執行JAR文件的形式分發給用戶。 為了跟蹤使用情況並協助診斷,我想向應用程序添加日志記錄功能,但是,從一個執行到下一個執行,我永遠無法確定用戶將在哪里運行該應用程序。

為了使此工作正常進行,我已將應用程序配置為使用log4j套接字附加程序-不管用戶在何處運行此應用程序,都將消息發送到套接字並正確記錄,這是完美的。

不過,我現在正在運行的是,與在將應用程序部署到生產環境中時相比,我寧願在本地運行時使用不同的log4j配置。 在本地運行時(從我的IDE IntelliJ),出於以下幾個原因,我希望使用控制台附加程序:

  1. 看到正在發生的事情是微不足道的。
  2. 我應該在沒有Internet連接的情況下進行開發,但我不想掛斷無法連接的電話。
  3. 我不想將開發過程中的工作變得混亂。

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

有什么簡單的方法可以完成我想要的嗎? 我正在使用Maven來構建我的應用程序,但是我對此並不熟練。

事實證明,這比我最初預期的要簡單-Vikdor的評論使我找到了正確的答案。 我開始研究具有多個配置文件(一個用於開發人員,一個用於產品),但后來意識到我並不需要兩個。 在本地工作時,我並沒有真正完成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,這為我提供了一個控制台附加程序。 當我打包生產發行版時,Maven將使用備用套接字替換默認的log4j.properties文件。

謝謝!

這是解決問題的一種更簡單的方法...

將兩個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進行配置的屏幕截圖:

在此處輸入圖片說明

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM