繁体   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