Java Logger,记录消息列表

时间:2017-01-04 17:02:26

标签: java csv logging

我有以下方法

    public static boolean isCSVStructureValid(InputStream csv, InputStream csvSchema){

    boolean failFast = true;
    boolean trace = false;
    Reader csvReader = new InputStreamReader(csv);
    Reader csvSchemaReader = new InputStreamReader(csvSchema);
    List<Substitution> pathSubtitution = new ArrayList<>();
    List<FailMessage> messages = CsvValidator.validate(csvReader, csvSchemaReader, failFast,
                       pathSubtitution,true, trace);
    if (messages.isEmpty()){
        return true;
    }
    else{
        LOGGER.log(Level.SEVERE, "The CSV stream structure is invalid: {0}", messages);
        return false;
    }
}

如何记录List消息中存储的消息内容? 这是FailMessage类型的JavaDoc:http://javadox.com/uk.gov.nationalarchives/csv-validator-java-api/1.0-RC2/uk/gov/nationalarchives/csv/validator/api/java/FailMessage.html

目前我得到了这个输出:

SEVERE: The CSV stream structure is invalid: [uk.gov.nationalarchives.csv.validator.api.java.ErrorMessage@1a4927d6]

虽然我希望看到更有用的内容,例如:

SEVERE: The CSV stream structure is invalid: [3.6] failure: Invalid column definition

User ID: positiveInteger

     ^

我可以通过这样做获得:

        LOGGER.log(Level.SEVERE, "The CSV stream structure is invalid: {0}", messages.get(0).getMessage());

3 个答案:

答案 0 :(得分:0)

在您的情况下,ErrorMessage不会覆盖toString方法,以根据您的预期提供正确的消息。当您知道它存储为列表时,如果您可以获取列表并通过它们进行迭代

答案 1 :(得分:0)

优雅的解决方案是:

            messages.forEach(m -> LOGGER.log(Level.SEVERE,m.getMessage()));

答案 2 :(得分:0)

正如您所看到的,该类不会覆盖默认的Object.toString()。如果您关注链接,您将在javadoc中看到。

您有几种方法可以解决此问题:

  1. 最简单的方法是覆盖该方法: 如果可以,您可以修改此类。但我猜你用它作为API。 在这种情况下,请考虑向其存储库发出拉取请求: https://github.com/digital-preservation/csv-validator/pulls

  2. 您可以通过迭代对象来创建一个返回String的辅助方法,调用getMessage()并将结果附加到StringBuilder

  3. 您可以为记录器创建自定义格式化程序,请参阅java.util.logging.Formatter.format(java.util.logging.LogRecord) 我假设您使用此日志记录框架。

  4. 高级解决方案是使用字节码修改。 Inject New Methods and Properties into Classes During Runtime

  5. 希望您能从上面的列表中找到一个好的解决方案。