跨多个环境的 Java 日志记录

标签 java logging log4j

我们的团队正在尝试进入单一构建状态;发送到测试的构建与提升到暂存->等->生产的构建相同。现在,为不同环境设置日志记录有点棘手(目前我们使用 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-classiclog4j-over-slf4j 作为依赖项并删除 log4j)

关于跨多个环境的 Java 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15549388/

相关文章:

java - Sonar 违反 if 语句中未使用的方法

linux - ssh & 脚本问题

java - 如何避免 Flyway Migrations 锁定 SQLite 数据库?

Java-setVisible(true)

python - 按缩进或前缀长度显示日志上下文级别

logging - 如何在 BAL 消息中添加长文本?

java - 将 Log4J INFO 发送到数据库并将 DEBUG 发送到控制台?

tomcat - log4j 登录 catalina-date.log

java - Log4j2:如何为每个用户将日志写入单独的文件?

java - Java 堆中存在许多 java.time.ZoneRegion 实例。难道 ZoneId 实例不应该被缓存吗?