在 log4j 2 中使用 throwable 和参数

dve*_*opp 6 java logging log4j exception log4j2

我想用一些动态参数记录一个错误(使用 log4j 2),以便更好地理解出了什么问题,我面临的问题是没有像这样的方法:

void error(String message, Throwable t);
Run Code Online (Sandbox Code Playgroud)

带参数支持。

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

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

有没有更好的方法来实现它而不是像这样使用它?

LOGGER.error("Error removing token for account " + accountId, e);
Run Code Online (Sandbox Code Playgroud)

rgo*_*ers 2

实际上,几乎所有接受消息和参数的 log4j 日志记录方法也接受 Throwable。自第一个版本以来,您始终能够执行以下操作:

logger.error("Error removing token for account {}", account, ex);
Run Code Online (Sandbox Code Playgroud)

请注意,格式字符串只有一个参数,因此末尾的可抛出项将作为附加到消息的异常记录。这就是 ParameterizedMessage 类的工作原理。

此外,Log4j 2.13.0 中添加了对 LogBuilder 的支持,它允许您执行以下操作

logger.atError().withException(ex).log("Error removing token for account {}", account);
Run Code Online (Sandbox Code Playgroud)

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