Log4j 隐式字符串格式化
Log4j Implicit String Formatting
我正在使用 log4j v1.2.14
登录我的项目,我还使用 Java 7
String.format() 将变量放入我的输出中。目前我正在写作
LOGGER.info(String.format("Your var is [%s] and you are [%s]", myVar, myVar1));
这真的是输出字符串的最佳方式吗?我觉得 log4j
应该隐式实现如下:
LOGGER.info("Your var is [%s] and you are [%s]", myVar, myVar1);
我错过了什么吗?此外,是否有支持此功能的 Java 日志框架?
顺便说一句,在这种情况下,使用 +
将变量添加到字符串和 String.format
之间没有太大区别 - 除非你真的想重用 "Your var is..."你的日志。
slf4j 允许您登录为
log.info("Your var is {} and you are {}", myVar, myVar1);
请注意使用 {}
而不是打印格式化程序。这也需要 Java >= 1.5
slf4j's api provides "parameterized logging”,它允许您完全做到这一点,尽管语法略有不同。示例是:
logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);
对于实现,您可以使用本机实现 slf4j 的 Logback,或者使用 slf4j 绑定来连接 log4j 或其他记录器。 The User Manual 对此进行了解释,并提供了一个简短的示例。
使用 String.format
、+
或除您的日志系统提供的格式之外的字符串格式化程序(例如 log4j
)被认为是一种不好的做法。通常,在代码中有很多您不想在生产中看到的低级日志(调试、信息)。例如,如果您使用 String.format
来格式化要记录的字符串,那么您将生成并格式化一个新字符串,该字符串可能很长并且会消耗资源,即使最后什么也不会记录(例如,如果 log4j
最小级别设置为警告或错误)。
通过使用记录器格式化程序系统(如 log4j
中的系统),您可以让记录器避免生成不需要记录的格式化字符串。
这在某些情况下可能会有很大的不同。
Log4j 支持内部格式化。我没有在任何地方找到它的记录,但我在这里看到了一个例子:
https://logging.apache.org/log4j/2.x/manual/markers.html
我试过了,很有效!我在 log4j 2.11.2.
int i = 42;
String str1 = "the answer";
String str2 = "life, the universe, and everything";
console.info("{} is {} to {}", i, str1, str2);
查看 Logger 的 javadoc,我会说它是在 Lo4j 2 中引入的,并且最多支持 10 个参数。
https://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/Logger.html
我正在使用 log4j v1.2.14
登录我的项目,我还使用 Java 7
String.format() 将变量放入我的输出中。目前我正在写作
LOGGER.info(String.format("Your var is [%s] and you are [%s]", myVar, myVar1));
这真的是输出字符串的最佳方式吗?我觉得 log4j
应该隐式实现如下:
LOGGER.info("Your var is [%s] and you are [%s]", myVar, myVar1);
我错过了什么吗?此外,是否有支持此功能的 Java 日志框架?
顺便说一句,在这种情况下,使用 +
将变量添加到字符串和 String.format
之间没有太大区别 - 除非你真的想重用 "Your var is..."你的日志。
slf4j 允许您登录为
log.info("Your var is {} and you are {}", myVar, myVar1);
请注意使用 {}
而不是打印格式化程序。这也需要 Java >= 1.5
slf4j's api provides "parameterized logging”,它允许您完全做到这一点,尽管语法略有不同。示例是:
logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);
对于实现,您可以使用本机实现 slf4j 的 Logback,或者使用 slf4j 绑定来连接 log4j 或其他记录器。 The User Manual 对此进行了解释,并提供了一个简短的示例。
使用 String.format
、+
或除您的日志系统提供的格式之外的字符串格式化程序(例如 log4j
)被认为是一种不好的做法。通常,在代码中有很多您不想在生产中看到的低级日志(调试、信息)。例如,如果您使用 String.format
来格式化要记录的字符串,那么您将生成并格式化一个新字符串,该字符串可能很长并且会消耗资源,即使最后什么也不会记录(例如,如果 log4j
最小级别设置为警告或错误)。
通过使用记录器格式化程序系统(如 log4j
中的系统),您可以让记录器避免生成不需要记录的格式化字符串。
这在某些情况下可能会有很大的不同。
Log4j 支持内部格式化。我没有在任何地方找到它的记录,但我在这里看到了一个例子:
https://logging.apache.org/log4j/2.x/manual/markers.html
我试过了,很有效!我在 log4j 2.11.2.
int i = 42;
String str1 = "the answer";
String str2 = "life, the universe, and everything";
console.info("{} is {} to {}", i, str1, str2);
查看 Logger 的 javadoc,我会说它是在 Lo4j 2 中引入的,并且最多支持 10 个参数。
https://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/Logger.html