【问题标题】:How to align log messages using java.util.logging如何使用 java.util.logging 对齐日志消息
【发布时间】:2011-05-02 20:24:09
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: java logging


    【解决方案1】:

    您可以创建自己的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 以涵盖您能想到的几乎所有情况。

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

    编辑:

    您可以使用StringBuilderString.format() 来代替\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() 将字符串格式化为表格。

    【讨论】:

    • 是的,这是一个解决方案,但可以使用 MessageFormat#format 来实现吗?看看这个:download.oracle.com/javase/6/docs/api/java/text/…, java.lang.StringBuffer, java.text.FieldPosition) 有第三个参数 pos,它的描述是:在输入时:一个对齐字段,如果需要的话。输出时:对齐字段的偏移量。
    • FieldPosition 与输出对齐无关。这是一个处理/更改这些 {} 的字段以及各自的位置和格式的类。 MessageFormat 类只是使用String.format 完成的另一种方式。为什么要使用它?
    • 好吧,我在某处读到它比手动附加数据要快,而 javadocs 是不可理解的。好吧,只是出于好奇:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2018-01-22
    相关资源
    最近更新 更多