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

时间:2011-05-02 20:24:10

标签: java logging

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

[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但无济于事。

由于

1 个答案:

答案 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可能不足以完全对齐它们。

解决方案可能会在必要时使用,以涵盖您能想到的几乎所有情况。

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

编辑:

您可以将StringBuilderString.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()将字符串格式化为表格。