现在我有一个使用标准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,这可能是我需要的,除了它是每个线程而不是每个记录器。
这里最好的方法是什么?
答案 0 :(得分:0)
JDK日志记录设置为包含您作为日志参数所需的所有内容。但是,您可以执行一些操作,但必须确定要放置此上下文的位置。
如果您只是希望渲染的输出显示分数,则继承SimpleFormatter并覆盖format
方法以预先添加分数。只要您的子类引用了Tetris
对象,您的自定义格式化程序就会生成输出。这种方法是首选,但您无法在过滤时检查此方法。
另一种选择是通过预先加分并返回true
来创建filter modifies current message的自定义handler。然后在正在使用的every logger上安装过滤器,或者将其安装在生成日志记录的https://pkg.jenkins.io/debian/jenkins-ci.org.key上。这里的一个问题是您应该检测LogRecord是否已被更改以确保您不会反复更改消息。