跨多个环境的Java日志记录

时间:2013-03-21 13:49:36

标签: java logging log4j

我们的团队正试图进入单一构建状态;发送给Test的构建版本与升级到Staging-> etc-> Production的构建相同。现在为不同的环境设置日志记录是一个棘手的问题(目前我们使用Maven配置文件并在构建时过滤记录器配置)。

我们有很多网络应用程序,我希望应用程序可以定义日志记录,并可以根据部署的环境进行配置。

我们使用Log4j,虽然我们对可以使其工作的不同实现持开放态度。我们希望应用程序能够定义记录器,因为某些应用程序可能希望特定日志记录在某些软件包上,但最终,我希望环境能够配置日志记录路径和级别。例如,QA环境通常可以在INFO包上进行com.foo.bar级别的日志记录,但是如果它们遇到棘手的问题,他们可能希望将其提升到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 ...

我确信此问题已经解决过了。什么是最好的方法呢?

2 个答案:

答案 0 :(得分:2)

使用Log4j api通过代码设置日志级别。因此,根据环境,在应用启动时,您可以设置日志配置。您甚至可以通过提供适当的UI来定义不同包的日志级别,以便在运行时进行配置,当然,如果需要的话。

答案 1 :(得分:2)

有几次尝试使这更好,但到目前为止还没有人提出“标准”解决方案:

  • 您可以使用MBean配置日志记录。

    Pro:您可以在运行时远程轻松更改配置 Con:你不能用这种方式保存/收集配置“配置文件”(即一组有用的配置)。

  • 您可以使您的日志记录框架从Web应用程序外部加载配置。

    Pro:可以轻松地将文件收集到文件中    您可以使用构建时脚本从模板等生成它们。

    Con:您需要将这些文件保存在某处,备份/安装它们等 当找不到任何一个时,你最好找出一种加载默认配置的方法

  • 您可以允许应用程序在运行时切换配置。只需确保初始配置对调试启动问题很有用

  • 某些日志记录框架(如logback)允许包含配置文件。这样可以轻松加载共享配置,然后使用单个系统属性指定要使用覆盖加载哪个包含文件。

目前,我更喜欢最后一种方法,因为它允许任意数量的特殊配置。测试团队可以拥有自己的经理,自己管理,随意更新。

请注意,用slf4j / logback替换log4j意味着只替换几个JAR文件。如果您使用Maven,则需要2分钟(只需添加logback-classiclog4j-over-slf4j作为依赖项并删除log4j