为多个webapp维护多个log4j.xml配置

时间:2015-09-09 18:09:26

标签: java xml tomcat logging log4j

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

  • 每个webapp都有一个不同的DailyRollingFileAppender文件名
  • 通常有2-3个appender(信息/错误日志,审计,统计)
  • 可能具有唯一的记录器级别定义,以减少某些繁琐的组件。

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

  • 开发人员希望TRACE记录所有内容,测试人员需要INFO日志记录,系统管理员(用于生产部署等)只需要ERROR级别
  • 开发人员和测试人员对DailyRollingFileAppender感到满意,而系统管理员希望使用logrotate
  • sys admins想要压缩日志,这对开发人员和测试人员来说很不方便。

因此,最明显的解决方案当然是为每个webapp提供3个变体(log4j.xml.dev,log4j.xml.test,log4j.xml.prod)中的log4j.xml,并以某种方式重新部署相应的。这看起来像是一场维持甚至安装的噩梦。

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

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

1 个答案:

答案 0 :(得分:0)

对于其他有相同问题的海报,我会在这里发布一个不理想的答案,但提供部分解决方案,至少对我们而言。

  • 迁移到log4j 2。它可以更好地控制您旋转日志的方式,并允许将它们压缩起来
  • 创建2个log4j配置:一个用于调试,一个用于生产。我们使用Maven进行构建和发布,因此Maven的配置文件控制将log4j模型添加到webapp:build profile将获取调试/扩展配置,而release将获取减少的生产配置:

    <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>
        ...