有人可以发布如何在日志消息中实现对齐:
[10:14:31 main package1.Class1 <init> INFO]: initializing data..
[10:14:31 Thread-0 package2.Class2 method1 INFO]: log message
我知道我可以使用log4j,但我想知道如何使用JUL实现这一点。 我尝试使用MessageFormat,FieldPosition但无济于事。
由于
答案 0 :(得分:3)
您可以创建自己的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可能不足以完全对齐它们。
解决方案可能会在必要时使用,以涵盖您能想到的几乎所有情况。
话虽如此,完美的解决方案是保存所有输出信息,最后根据每个字段的长度计算使用的数量。
编辑:
您可以将StringBuilder
与String.format()
一起用于更清晰,更易于阅读的代码,而不是\ t \ t
sb.append(String.Format("[%1$-10s %2$-10s %3$-10s]: %4",
new Data(record.getMillis(),
record.getSourceMethodName(),
record.getSourceClassName(),
formatMessage(record)
));
检查this page如何使用String.format()
将字符串格式化为表格。