使用SimpleFormatter限制字符串长度

时间:2016-03-02 11:18:58

标签: java logging java.util.logging

我正在尝试以SimpleFormatter格式限制source参数的长度,以便在Tomcat 8中使用。

我已经阅读了SimpleFormatter docFormatter syntax doc,虽然我不会假装我已经理解了所有第二个,但是数字的参数应该限制它的长度。

然而,在我的测试中并没有:

输出的行

java.util.logging.SimpleFormatter.format = %4$s %n

java.util.logging.SimpleFormatter.format =%4$1s %n

无法区分。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

  

我试图以SimpleFormatter格式限制源参数的长度,以便在Tomcat 8中使用。

由于您只需要关卡的第一个字符,因此语法为%4$.1s

根据java.util.Formatter JavaDocs

  

常规,字符和数字类型的格式说明符具有以下语法:

   %[argument_index$][flags][width][.precision]conversion
  

可选宽度是一个正十进制整数,表示要写入输出的最小字符数

     

可选精度是非负十进制整数,通常用于限制字符数

这意味着使用点字符指定精度。由于您不关心最大值如果最小值为零,则必须从模式中省略它。

以下是构建模式的示例测试用例:

public static void main(String[] args) {
    //This really should be set as a command argument but, it works.

    //No min and max of seven chars of level.
    //System.setProperty("java.util.logging.SimpleFormatter.format", "%4$.7s %n");

    //Min and max of seven chars of level (right justified).
    //System.setProperty("java.util.logging.SimpleFormatter.format", "%4$7.7s %n");

    //Min and max of seven chars of level (left justified).
    //System.setProperty("java.util.logging.SimpleFormatter.format", "%4$-7.7s %n");

    //No min with max of one chars of level.
    System.setProperty("java.util.logging.SimpleFormatter.format", "%4$.1s %n");

    LogRecord r = new LogRecord(Level.SEVERE, "Message");
    r.setLoggerName("logger");
    r.setSourceClassName("class");
    r.setSourceMethodName("method");
    System.out.println(new SimpleFormatter().format(r));
}

JavaDocs还声明:

  

对于字符,整数和日期/时间参数类型以及百分比和行分隔符转换,精度不适用;如果提供精度,则抛出异常。

而不是'参数类型'文档应该真的说“论证类别'”。 ''和' S'被认为是“一般的'而不是'字符'在参数类别表中。这就是为什么你可以使用点精度。