Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有支持智能参数扩展、String.format等的java库_Java_Logging - Fatal编程技术网

是否有支持智能参数扩展、String.format等的java库

是否有支持智能参数扩展、String.format等的java库,java,logging,Java,Logging,以下是我想要的: 爪哇 可以替代commons日志或slf4j的日志库 仅当日志级别需要时才进行参数扩展(即,如果(log.isDebugEnabled())blocks,则无if) 字符串格式与java.lang.String.format 检测java.lang.Throwable作为最终参数和日志堆栈跟踪 目标是编写这样的代码 private static final Log log = new Log.getLog(MyClass.class); // ... String valu

以下是我想要的:

  • 爪哇
  • 可以替代commons日志或slf4j的日志库
  • 仅当日志级别需要时才进行参数扩展(即,如果(log.isDebugEnabled())blocks,则无
    if)
  • 字符串格式与
    java.lang.String.format
  • 检测java.lang.Throwable作为最终参数和日志堆栈跟踪
目标是编写这样的代码

private static final Log log = new Log.getLog(MyClass.class);
// ...
String value = "test";
log.debug("The value is [%s]", value); // [1]
// ...
} catch (Exception e) {
    log.error("Caught Exception: %s", e.getMessage(), e); // [2]
}
[1] 将打印日志语句,如

The value is [test]
如果日志级别为
INFO
,则不会执行字符串格式操作

[2] 将打印

Caught Exception: [value of e.getMessage()]
java.lang.Exception
  at com.my.org.MyClass.myMethod(MyClass.[line number])
  at [...]
对我来说,这似乎是相当理智的行为。我很惊讶,我很难找到这样的图书馆

编辑:我应该指定,但slf4j不满足所有这些要求。

JBoss有一个可以进行printf和MessageFormat样式格式化的。据推测,它可以单独使用,但我找不到适合它的项目,除了它与Seam焊料的集成。不过也有独立的工件:

JBoss有一个可以进行printf和MessageFormat样式格式化的组件。据推测,它可以单独使用,但我找不到适合它的项目,除了它与Seam焊料的集成。但也有独立的工件:

爪哇

带有Logback绑定的SLF4J

可以替代commons日志或slf4j的日志库

唯一成熟的替代方案是Log4J和
java.util.logging

仅当日志级别需要时才进行参数扩展(即,如果(log.isDebugEnabled())块为否)

在SLF4J中,如果键入:

log.debug("Names are: {}", namesCollection);
然后,只有当
isDebugEnabled()
返回true(无需显式提供)时,才会执行toString()

字符串格式与java.lang.String.format相同

您真的需要在日志文件中使用奇特的格式(小数、货币、区域设置)吗?或者
{}
延迟扩展是否足够(见上文)

检测java.lang.Throwable作为最终参数和日志堆栈跟踪

SLF4J就是这样工作的

爪哇

带有Logback绑定的SLF4J

可以替代commons日志或slf4j的日志库

唯一成熟的替代方案是Log4J和
java.util.logging

仅当日志级别需要时才进行参数扩展(即,如果(log.isDebugEnabled())块为否)

在SLF4J中,如果键入:

log.debug("Names are: {}", namesCollection);
然后,只有当
isDebugEnabled()
返回true(无需显式提供)时,才会执行toString()

字符串格式与java.lang.String.format相同

您真的需要在日志文件中使用奇特的格式(小数、货币、区域设置)吗?或者
{}
延迟扩展是否足够(见上文)

检测java.lang.Throwable作为最终参数和日志堆栈跟踪


SLF4J就是这样工作的。

AFAIK,参数扩展或使用评估在Java中是不可能的。任何传递给方法的表达式参数(例如,
obj.toString()
)都必须事先求值。许多框架(特别是sl4j)通过接受
对象而不是
字符串提供了一个巧妙的技巧,因此
obj.toString()
仅在需要时才执行。除此之外,运气不好。:-)在Java中,参数扩展或使用时评估是不可能的。任何传递给方法的表达式参数(例如,
obj.toString()
)都必须事先求值。许多框架(特别是sl4j)通过接受
对象而不是
字符串提供了一个巧妙的技巧,因此
obj.toString()
仅在需要时才执行。除此之外,运气不好。:-)感谢您的回复,但我目前正在使用slf4j。它不能满足我的所有要求(即String.format格式化)。@三杯java,
%d
%f
%s
给你买了
{}
没有的东西?我唯一能想到的是你是否想做像%2.2f这样的事情。但老实说,您的日志应该像业务报告一样格式化,您需要原始输出。@TimBender,它为我买什么真的重要吗?问题是需要一个日志库,该库扩展的参数与java的
String.format
@three\u cups\u相同,如果您对您的需求没有合理的理由,那么您可能需要重新考虑该需求。不管怎样,Mac给出了一个符合你要求的答案。@TimBender,我唯一的观点是你似乎在说一个不符合我要求的答案就足够了,因为你想不出我的要求/问题有效的理由。我大体上同意slf4j提供的功能非常接近,应该满足大多数项目的日志需求。不幸的是,我并不总是控制我的所有环境/需求,所以我不能真正捍卫我的需求,除非说这是一个需求。感谢您的回复,但我目前正在使用slf4j。它不能满足我的所有要求(即String.format格式化)。@三杯java,
%d
%f
%s
给你买了
{}
没有的东西?我唯一能想到的是你是否想做像%2.2f这样的事情。但老实说,您的日志应该像业务报告一样格式化,您需要原始输出。@TimBender,它为我买什么真的重要吗?问题是需要一个日志库,该库扩展的参数与java的
String.format
@three\u cups\u相同,如果您对您的需求没有合理的理由,那么您可能需要重新考虑该需求。不管怎样,Mac给出了一个符合你要求的答案。@TimBender,我唯一的观点是你似乎在说一个不符合我要求的答案就足够了,因为你想不出我的要求/问题有效的理由。我同意基恩的观点