如何在打包时更改log4j配置

时间:2012-11-14 02:20:35

标签: java maven log4j

我有一个相当简单的Java应用程序,它作为可执行的JAR文件分发给用户。为了跟踪使用情况并协助诊断,我想向应用程序添加日志记录功能,但是,从一次执行到下一次执行,我永远无法确定用户将在何处运行此应用程序。

为了完成这项工作,我已经将我的应用程序配置为使用log4j套接字appender - 无论用户在哪里运行此应用程序,都会将消息发送到套接字并正确记录,这是完美的。

我现在遇到的是,当我在本地运行时以及在将此应用程序部署到生产环境中时,我更倾向于使用不同的log4j配置。在本地运行时(从我的IDE,IntelliJ),我更喜欢使用控制台appender有几个原因:

  1. 看看发生的事情是微不足道的。
  2. 我是否应该在没有互联网连接的情况下进行开发,我不想挂断无法连接。
  3. 我不想把我在开发过程中所做的事情弄得一团糟。
  4. 然而,当我打包应用程序并分发它时,我希望它使用套接字appender,而不是控制台appender。

    有没有简单的方法来实现我想要的?我正在使用Maven来构建我的应用程序,但我并不熟练。

3 个答案:

答案 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配置它: -

enter image description here

答案 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。

谢谢!