我有一个相当简单的Java应用程序,它作为可执行的JAR文件分发给用户。为了跟踪使用情况并协助诊断,我想向应用程序添加日志记录功能,但是,从一次执行到下一次执行,我永远无法确定用户将在何处运行此应用程序。
为了完成这项工作,我已经将我的应用程序配置为使用log4j套接字appender - 无论用户在哪里运行此应用程序,都会将消息发送到套接字并正确记录,这是完美的。
我现在遇到的是,当我在本地运行时以及在将此应用程序部署到生产环境中时,我更倾向于使用不同的log4j配置。在本地运行时(从我的IDE,IntelliJ),我更喜欢使用控制台appender有几个原因:
然而,当我打包应用程序并分发它时,我希望它使用套接字appender,而不是控制台appender。
有没有简单的方法来实现我想要的?我正在使用Maven来构建我的应用程序,但我并不熟练。
答案 0 :(得分:4)
这是解决问题的简单方法......
将两个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配置它: -
答案 1 :(得分:3)
我强烈建议在运行时而不是构建时确定它。
例如,当您运行应用程序时,将config/
目录放在类路径的开头,然后将log4j.xml
放在那里。当然,您可能仍然在应用程序JAR中保留默认log4.xml
,因此如果您未在部署中提供它,您的应用程序仍然可以运行。
答案 2 :(得分:3)
事实证明这比我原先预期的要简单 - 而Vikdor的评论让我找到了正确的答案。我已经开始挖掘多个配置文件(一个用于dev,一个用于prod)但后来意识到我并不需要有两个。在本地工作时,我并没有真正完成Maven构建过程 - 我只是在执行Java类。我经历Maven构建过程的唯一一次是我想要打包我的应用程序进行部署。因此,我只是在我的POM文件中添加了一个使用maven-antrun-plugin的部分。我的最终代码最终看起来像这样:
文件: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。
谢谢!