为多个网络应用程序维护多个 log4j.xml 配置

Maintaining several log4j.xml configurations for multiple webapps

目前我们在 Tomcat 中有多个 (10+) webapps,每个都必须有自己的 log4j.xml 配置,因为

越来越大的挑战是,使用日志记录的各方需要不同的格式、规则和日志级别:

所以最明显的解决方案当然是在 3 个变体中使用 log4j.xml(log4j.xml.dev,log4j.xml.test,log4j.xml.prod) webapp 并以某种方式重新部署相应的。这看起来像是维护甚至设置的噩梦。

另一种选择是在 webapps 之外的某个位置,所有 webapps 都有 1 个 log4j.xml,它为该环境设置一次,而不是每次都重新部署。似乎更好,但是那个大的 log4j.xml 会变得混乱,而且我没有找到任何关于这是否通常是一个好方法或在这种情况下应该放置 log4j.xml 的建议。

所以如果有人有类似的困境,你是如何解决的?如果您使用了上述方法之一,或者您对完全不同的方法有想法 - 我想听听。谢谢

您可能有兴趣或值得一看 Logstash:

https://www.elastic.co/guide/en/logstash/current/config-examples.html

对于其他post有相同问题的人,我会post在这里回答,这不是很理想,但提供了部分解决方案,至少对我们来说。

  • 迁移到 log4j 2。它可以更好地控制您如何旋转日志并允许将它们压缩
  • 创建 2 个 log4j 配置:一个用于调试,一个用于生产。我们使用 Maven 进行构建和发布,因此 Maven 的配置文件控制将哪个 log4j 模型添加到 webapp:构建配置文件将选择 debug/extended 配置,而发布将选择减少的生产配置:

    <profiles>
    <profile>
        <id>logDebug</id>
        <activation>
            <property>
                <name>!release</name>
            </property>
        </activation>
        <properties>
            <log4j.xml>log4jDebug.xml</log4j.xml>
        </properties>
    </profile>
    <profile>
        <id>logRelease</id>
        <activation>
            <property>
                <name>release</name>
                <value>true</value>
            </property>
        </activation>
        <properties>
            <log4j.xml>log4jRelease.xml</log4j.xml>
        </properties>
    </profile>
    

然后:

<build>   
  ...  
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
      <executions>
        <execution>
          <phase>prepare-package</phase>
          <goals>
            <goal>run</goal>
          </goals>
          <configuration>
            <tasks>
              <echo message="Use log4j configuration file ${log4j.xml}" />
              <copy tofile="${project.build.directory}/classes/log4j.xml" overwrite="true">
                <fileset dir="src/main/resources/">
                  <include name="${log4j.xml}" />
                </fileset>
              </copy>
            </tasks>
          </configuration>
        </execution>
        ...