Java日志框架 - 支持printf()函数

7
在C语言中,printf()的使用非常简单,在Java中,System.out.printf()也很好用。但是在log4j中,似乎只能使用"First name: "+ firstName +", Age: " + age这种方式,非常不方便。
问题如下:
  • 为什么log4j无法实现这样的功能?
  • 有哪些日志框架支持此功能?您能提供一个包含Maven依赖项和Java代码的简短示例吗?
4个回答

12
你可以使用 org.slf4j.Logger,它提供了一种格式化log的方法。
例如,
LOGGER.info("Roll number of Student {} is {}.", studentName, rollNumber);

1
很好,我刚刚进行了一项测试,使用 slf4j-api 1.7.13 版本,info(String format, Object... arguments) 方法与 printf() 类似,用于 info 日志级别,唯一的区别是它会自动添加一个新行,因此不需要使用 \n - Eric

5

您可以使用String类的format方法,例如:

logger.info(String.format("Student %s with roll number %d found!", studentName, rollNumber));

使用这种方式不如使用slf4j,因为在将字符串传递到info方法之前必须进行格式化(并可能根据日志配置被过滤掉),因此它会做很多可能不必要的工作。 - Nathan Hughes
是的,那是一个不错的选择,但我在想如果这么容易,为什么log4j从未提供像那样的包装方法... - Eric
@NathanHughes 是的,它是这样的。但是在slf4j的格式方面更加复杂,并且在字符串的格式方法上消耗更多内存。请注意,它期望参数是一个数组。 - SMA
@SMA 我刚刚检查了 slf4j-api 1.7.13,它提供了可变长度参数列表,而不仅仅是单个数组。 - Eric
真的吗?我不确定。但如果是真的,即使在底层的c中使用printf()也使用了可变参数,所以我认为没问题。 - Eric

2

0

1
请阅读如何回答并更新您的答案。 - fartem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接