【问题标题】:Add new field to every JUL log statement向每个 JUL 日志语句添加新字段
【发布时间】:2018-04-05 00:24:11
【问题描述】:

现在我有一个使用标准 java.util.logging 包和 SimpleFormatter 写入日志的应用程序。我想知道是否有办法将某种“上下文”字段添加到 every 日志语句。

我想要的是这样的。假设我有一个俄罗斯方块游戏,它一直在记录移动,我希望它在每个日志语句上写下当前分数:

package org.tester;

import java.util.logging.Logger;

public class Tetris implements HighScoreGame {
    static Logger logger = Logger.getLogger("org.tester.Tetris");
    int score;

    void horizontalMove(Move move) {
        logger.info("Going sideways: " + move.direction);
        moveTarget();
    }

    void verticalMove() {
        logger.info("Falling...");
        if(landed()) {
          updateScore();
          logger.info("Done falling");
        } else {
          logger.info("Falling again in 5s")
        }
    }
}

我可以将字段附加到消息中。

logger.info("Score:" + score + " Falling...");

我不想这样做,因为我必须检查和编辑每条日志语句,而且真正的应用程序相当大。它还会阻止我使用格式化程序配置日志条目。

我想我可以扩展 SimpleFormatter 和 Logger,但似乎应该已经存在类似的东西了。

我也意识到 JUL 可能过于原始而无法满足我的需求,因此切换到另一个日志框架(如 Log4j2)可能是正确的解决方案。特别是 Log4j 有 Mapped Diagnostic Contexts,这可能是我需要的,除了它是每个线程而不是每个记录器。

这里最好的方法是什么?

【问题讨论】:

    标签: java java.util.logging


    【解决方案1】:

    JDK 日志记录设置为仅包含您需要的所有内容作为日志参数。但是,您可以使用一些技巧,但您必须决定要放置此上下文的位置。

    如果您只想让渲染的输出显示分数,则将 SimpleFormatter 子类化并覆盖 format 方法以添加分数。只要您的子类引用了Tetris 对象,您的自定义格式化程序就会产生输出。首选此方法,但您无法在过滤时对其进行检查。

    另一种选择是创建一个自定义filter,即modifiescurrent message,方法是在分数前面加上true。然后将过滤器安装在使用中的handler 或安装在正在生成日志记录的every logger 上。这里的一个问题是您应该检测 LogRecord 是否已被更改,以确保您不会重复更改消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      相关资源
      最近更新 更多