4

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

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

但是,我现在遇到的情况是,当我在本地运行时与将应用程序部署到生产环境时,我更愿意使用不同的 log4j 配置。在本地运行时(从我的 IDE,IntelliJ),出于以下几个原因,我更喜欢使用控制台附加程序:

  1. 看看发生了什么是微不足道的。
  2. 如果我在没有 Internet 连接的情况下进行开发,我不想因为无法连接而挂断电话。
  3. 我不想将生产日志与我在开发过程中所做的事情混为一谈。

但是,当我打包应用程序并分发它时,我希望它使用套接字附加程序,而不是控制台附加程序。

有什么简单的方法可以完成我想要的吗?我正在使用 Maven 来构建我的应用程序,但我对它的熟练程度并不高。

4

3 回答 3

4

事实证明这比我最初预期的要简单——维克多的评论让我找到了正确的答案。我已经开始研究拥有多个配置文件(一个用于开发,一个用于生产),但后来意识到我真的不需要两个。在本地工作时,我并没有真正经历 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,它为我提供了一个控制台附加程序。当我为生产发行版打包时,Maven 会将默认的 log4j.properties 文件替换为使用套接字附加程序的备用文件。

谢谢!

于 2012-11-15T15:08:52.947 回答
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 进行配置的屏幕截图:-

在此处输入图像描述

于 2012-11-16T15:54:11.907 回答
3

我强烈建议在运行时而不是构建时确定它。

例如,当您运行应用程序时,将config/目录放在类路径的开头,然后放在log4j.xml那里。当然,您仍然可以log4.xml在您的应用程序 JAR 中保留一个默认值,这样如果您在部署中不提供它,您的应用程序仍然可以运行。

于 2012-11-14T02:51:36.957 回答