为多个网络应用程序维护多个 log4j.xml 配置
Maintaining several log4j.xml configurations for multiple webapps
目前我们在 Tomcat 中有多个 (10+) webapps,每个都必须有自己的 log4j.xml 配置,因为
- 每个 webapp 都有不同的 DailyRollingFileAppender 文件名
- 通常有 2-3 个附加程序(info/error 日志、审计、统计)
- 上面可能有独特的记录器级别定义,以减少某些冗长的组件。
越来越大的挑战是,使用日志记录的各方需要不同的格式、规则和日志级别:
- 开发人员想要所有的 TRACE 日志记录,测试人员想要 INFO 日志记录,系统管理员(用于生产部署等)只想要 ERROR 级别
- 开发人员和测试人员都对 DailyRollingFileAppender 感到满意,而系统管理员则希望改用 logrotate
- 系统管理员想压缩日志,这对开发人员和测试人员来说很不方便。
所以最明显的解决方案当然是在 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>
...
目前我们在 Tomcat 中有多个 (10+) webapps,每个都必须有自己的 log4j.xml 配置,因为
- 每个 webapp 都有不同的 DailyRollingFileAppender 文件名
- 通常有 2-3 个附加程序(info/error 日志、审计、统计)
- 上面可能有独特的记录器级别定义,以减少某些冗长的组件。
越来越大的挑战是,使用日志记录的各方需要不同的格式、规则和日志级别:
- 开发人员想要所有的 TRACE 日志记录,测试人员想要 INFO 日志记录,系统管理员(用于生产部署等)只想要 ERROR 级别
- 开发人员和测试人员都对 DailyRollingFileAppender 感到满意,而系统管理员则希望改用 logrotate
- 系统管理员想压缩日志,这对开发人员和测试人员来说很不方便。
所以最明显的解决方案当然是在 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>
...