向每个JUL日志语句添加新字段

时间:2018-04-05 00:24:12

标签: java java.util.logging

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

我喜欢的是这样的。让我们说我有一个俄罗斯方块游戏,一直在记录动作,我希望它能在每个日志声明中写下当前的分数:

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...");

我不想,因为我必须经历并编辑每个日志语句,而真正的应用程序相当大。它还会阻止我使用Formatter配置日志条目。

我想我可以扩展SimpleFormatter和Logger,但看起来像这样的东西应该已经存在。

我也意识到JUL可能过于原始而不能做我想要的事情,所以切换到另一个日志框架如Log4j2可能是正确的解决方案。特别是Log4j有Mapped Diagnostic Contexts,这可能是我需要的,除了它是每个线程而不是每个记录器。

这里最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

JDK日志记录设置为包含您作为日志参数所需的所有内容。但是,您可以执行一些操作,但必须确定要放置此上下文的位置。

如果您只是希望渲染的输出显示分数,则继承SimpleFormatter并覆盖format方法以预先添加分数。只要您的子类引用了Tetris对象,您的自定义格式化程序就会生成输出。这种方法是首选,但您无法在过滤时检查此方法。

另一种选择是通过预先加分并返回true来创建filter modifies current message的自定义handler。然后在正在使用的every logger上安装过滤器,或者将其安装在生成日志记录的https://pkg.jenkins.io/debian/jenkins-ci.org.key上。这里的一个问题是您应该检测LogRecord是否已被更改以确保您不会反复更改消息。