2

我们的团队正在尝试进入 Single Build 状态;发送到 Test 的构建与升级到 Staging->etc->Production 的构建相同。现在为不同的环境设置日志记录有点棘手(目前我们使用 Maven 配置文件并在构建时过滤记录器配置)。

我们有许多 Web 应用程序,我希望日志记录由应用程序定义并由其部署到的环境进行配置。

我们使用 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 ...

我确信这个问题之前已经解决了。最好的方法是什么?

4

2 回答 2

2

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

于 2013-03-21T13:52:14.187 回答
2

已经进行了几次尝试以使其变得更好,但到目前为止还没有人提出“标准”解决方案:

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

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

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

    优点:配置可以很容易地收集在一个文件中。
    您可以使用构建时脚本从模板等生成它们。

    缺点:您需要将这些文件保存在某处,备份/安装它们等。
    您最好想办法在找不到时加载默认配置

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

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

目前,我更喜欢最后一种方法,因为它允许任意数量的特殊配置。测试团队可以拥有自己的,自己管理它,把它放在他们喜欢的任何地方,在他们空闲的时候更新它。

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

于 2013-03-21T14:06:31.557 回答