如何使用java.util.logging对齐日志消息

有人可以发布如何在日志消息中实现对齐:

[10:14:31 main package1.Class1  INFO]: initializing data.. [10:14:31 Thread-0 package2.Class2 method1 INFO]: log message 

我知道我可以使用log4j,但我想知道如何使用JUL实现这一点。 我尝试使用MessageFormat,FieldPosition但无济于事。

谢谢

您可以创建自己的java.util.logging.Formatter 。 为此你可以这样扩展它:

 import java.util.logging.Formatter; import java.util.logging.LogRecord; public final class MyFormatter extends Formatter { @Override public String format(LogRecord record) { StringBuilder sb = new StringBuilder(); // Build output the way you want sb.append(new Date(record.getMillis())) .append(" \t") .append(record.getThreadID()) .append(" \t") .append(record.getSourceMethodName()) .append(" \t") .append(record.getSourceClassName()) .append(" \t") .append(record.getLevel().getLocalizedName()) .append(": ") .append(formatMessage(record)) .append(System.getProperty("line.separator")); return sb.toString(); } } 

你明白了。

这只是一个如何处理输出并使用\ t对齐它的示例。 这不是一个完美的解决方案,因为您事先并不知道SourceMethodName或SourceClassName或任何其他输出字段的长度是什么,只有一个\ t可能不足以完全对齐它们。

该解决方案可以根据需要使用,以涵盖几乎所有您能想到的情况。

话虽这么说,完美的解决方案是保存所有输出信息,最后根据每个字段的长度计算使用的数量。

编辑:

而不是\ t你可以将StringBuilderString.format()一起使用到更清晰,更易于阅读的代码:

 sb.append(String.Format("[%1$-10s %2$-10s %3$-10s]: %4", new Data(record.getMillis(), record.getSourceMethodName(), record.getSourceClassName(), formatMessage(record) )); 

检查此页面 ,了解如何使用String.format()将字符串格式化为表格。