在log4j 2中将throwable与参数一起使用

时间:2018-08-06 10:32:13

标签: java exception logging log4j log4j2

我想用一些动态参数记录一个错误(使用log4j 2),该参数可以更好地了解出了什么问题,并且我遇到了没有方法的问题:

void error(String message, Throwable t);

具有参数支持。

在我的代码中,我希望异常和参数都填充消息中的{}:

    try {
        //...
    } catch (Exception e) {
        LOGGER.error("Error removing data for account {}", accountId, e);
    }

有没有比这样使用它更好的方法了?

LOGGER.error("Error removing token for account " + accountId, e);

2 个答案:

答案 0 :(得分:0)

您可以为此单独格式化消息,但我必须为此编写一个辅助方法:

public void logException(Exception ex, String fmt, Object... args) {
    Message msg = log.getMessageFactory().newMessage(fmt, args);
    log.error(msg, ex);
}

答案 1 :(得分:0)

实际上,几乎所有接受消息和参数的 log4j 日志记录方法也接受 Throwable。自第一个版本以来,您一直可以做到:

logger.error("Error removing token for account {}", account, ex);

请注意,格式字符串只有一个参数,因此最后的 throwable 会作为附加到消息的异常记录。这就是 ParameterizedMessage 类的工作原理。

此外,Log4j 2.13.0 中添加了对 LogBuilder 的支持,允许您执行

logger.atError().withException(ex).log("Error removing token for account {}", account);

这样比较清楚。请注意,以下所有方法都会被调用,但如果未记录错误级别,则 atError() 之后的所有方法都是无操作的。