我们的团队正在尝试进入单一构建状态;发送到测试的构建与提升到暂存->等->生产的构建相同。现在,为不同环境设置日志记录有点棘手(目前我们使用 Maven 配置文件并在构建时过滤记录器配置)。
我们有许多 Web 应用程序,我希望日志记录由应用程序定义并由其部署到的环境进行配置。
我们使用 Log4j,尽管我们对可以实现此功能的不同实现持开放态度。我们希望应用程序能够定义记录器,因为某些应用程序可能需要对某些包进行特定日志记录,但最终,我希望环境能够配置日志记录路径和级别。例如,QA 环境通常可能在 com.foo.bar
包上有 INFO
级别的日志记录,但是,如果他们遇到棘手的问题,他们可能希望解决这个问题最多DEBUG
。我不想重新部署应用程序,因为这在技术上会改变构建。
通过最少的探索,我发现 log4j 可以直接使用系统属性,因此这样的设置是可能的:
<appender name="someAppender" class="com.whatevs.SomeAppender">
<param name="File" value="${logger.path}/some_app.log"/>
<!-- ... -->
</appender>
<logger name="com.foo.bar">
<level value="${logger.level.com.foo.bar}"></level>
</logger>
<root>
<priority value="${logger.priority}"/>
<appender-ref ref="someAppender"/>
</root>
我担心的是,随着部署的应用程序数量和定义的记录器数量的增加,维护系统属性的开销可能会变得很麻烦:
-Dlogger.path=/var/log -Dlogger.priority=INFO -Dlogger.level.com.foo.bar=WARN ...
我确信这个问题之前已经得到解决。最好的方法是什么?
最佳答案
已经进行了多次尝试来改善这一点,但到目前为止还没有人提出“标准”解决方案:
您可以使用 MBean 配置日志记录.
优点:您可以在运行时轻松远程更改配置
缺点:您无法通过这种方式保存/收集配置“配置文件”(即一组有用的配置)。您可以使日志框架从网络应用程序外部加载配置。
优点:可以轻松地将配置收集到文件中。
您可以使用构建时脚本从模板等生成它们。缺点:您需要将这些文件保存在某处,备份/安装它们等。
当找不到默认配置时,您最好找到一种加载默认配置的方法您可以允许应用程序在运行时切换配置。只需确保初始配置对于调试启动问题有用
一些日志框架(例如 logback)允许包含配置文件。这样可以轻松加载共享配置,然后使用单个系统属性来指定要加载并覆盖的包含文件。
目前,我更喜欢最后一种方法,因为它允许任意数量的特殊配置。测试团队可以拥有自己的、自己管理、放在任何他们喜欢的地方、随意更新。
请注意,用 slf4j/logback 替换 log4j 意味着仅替换几个 JAR 文件。如果您使用 Maven,则需要 2 分钟(只需添加 logback-classic
和 log4j-over-slf4j
作为依赖项并删除 log4j
)
关于跨多个环境的 Java 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15549388/