[英]How to Change log4j Configuration When Packaging
我有一個相當簡單的Java應用程序,它以可執行JAR文件的形式分發給用戶。 為了跟蹤使用情況並協助診斷,我想向應用程序添加日志記錄功能,但是,從一個執行到下一個執行,我永遠無法確定用戶將在哪里運行該應用程序。
為了使此工作正常進行,我已將應用程序配置為使用log4j套接字附加程序-不管用戶在何處運行此應用程序,都將消息發送到套接字並正確記錄,這是完美的。
不過,我現在正在運行的是,與在將應用程序部署到生產環境中時相比,我寧願在本地運行時使用不同的log4j配置。 在本地運行時(從我的IDE IntelliJ),出於以下幾個原因,我希望使用控制台附加程序:
但是,當我打包應用程序並分發它時,我希望它使用套接字附加程序,而不是控制台附加程序。
有什么簡單的方法可以完成我想要的嗎? 我正在使用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.