SLF4J正告或过错信息及其意义-Java-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:216回复:0

  SLF4J正告或过错信息及其意义

楼主#
更多 发布于:2016-05-22 15:02

SLF4J正告或过错信息及其意义

 调用办法o.a.commons.logging.impl.SLF4FLogFactory.release

已给出的共用日志API(common-logging

API),实践上是由SLF4J完成的,o.a.commons.logging.impl.SLF4FLogFactory.release办法永远不会被调用。但是,取决于commons-logging.jar在服务器小程序容器的布置,release()办法也许意外地经过commons-logging.jar装载的org.apache.commons.logging.LogFactoryl类被调用。

当Tomac装置后,$TOMAC_HOME代表目录;在近来的Tomac版别上,这是个遍及的景象,特别当你在使用中在WEB-INF/lib下放置jcl-over-slf4j.jar包,而不是在$TOMCAT_HOME/common/lib下放置jar包。为了彻底取得jcl-over-slf4j.jar包的稳定性,咱们主张你在$TOMCAT_HOME/common/lib目录下放置jcl-over-slf4j.jar包,没有在你的web使用里放置副本。

也请你看下bug#22。

jcl-over-slf4j不支持的[某个]操作

当调用JCL1.1中受维护的办法,会抛出不支持操作反常

(UnsupportedOperationException)。这些办法都是经过commons-logging.jar中LogFactory 完成调用。

当然,LogFactory由

jcl-over-slf4j.jar包下的SLF4FLogFactory完成,SLF4FLogFactory不调用这些办法。

假如你研讨这个疑问,很大也许是你的commons-logging.jar副本在类的途径下覆盖了jcl-over-slf4j.jar包中的类。

当调用o.a.commons.logging.impl.SLF4FLogFactory.release()办法时,留意实践上这个疑问跟宣布的正告是非常相似的,已在前一个章节评论了。

日志称号不匹配检查

只要slf4j.detectLoggerNameMismatch体系特点设置为true时,日志称号不匹配正告才会打印。默许状况下,这个特点没有设置,即便在日志称号不匹配的状况下也不会打印正告。

从1.7.9开端,在指定称号的日志器下,向LoggerFactory.getLogger(Class)办法传参,正告信息就会被打印,这个办法和SLF4J内部推断的调用者的称号不相同。

例如,代码块如下:

package com.acme;import com.foo.Kangaroo;class Fruit {Logger logger =

LoggerFactory.getLogger(Kangaroo.class);}

成果将会显现:

SLF4J: Detected logger name mismatch. Given

name:"com.foo.Kangaroo"; computed name: "com.acme.Fruit".

但只在slf4j.detectLoggerNameMismatch体系特点设置为true时才显现。

当日志器中传入的参数类是一个基类,这种特定状况下子类不会呈现任何正告信息,例如:

class A {Logger logger =

LoggerFactory.getLogger(getClass());}class B extends A {// no mismatch warning

will be issued when B is instantiated// given that class A is a super-type of

class B}

假如你遇到不能解说的不匹配正告,你能够用白色大象符号它,当界说了日志器,这种不能准确推断出类名的状况是非常少的。咱们也很有爱好去取得这些类。假如你符号了一个无法解说的不匹配信息,请给咱们发一个[日志陈述](

http://www.slf4j.org/bug-reporting.html)文件。

加载org.slf4j.impl.StaticLoggerBinder类失利

当org.slf4j.impl.StaticLoggerBinder类不能从内存中加载是,将会陈述这个过错信息。当在类途径中没有适宜的SLF4J绑守时,这种状况会发作。放置一个jar包(只能放其间的一个):slf4j-nop.jar,

slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar,

logback-classic.jar。在类途径中放置一个就能够处理疑问。

从1.6.0: 1.6版别的SLF4J,没有绑定,SLF4J默许是一个无操作日志完成。

你能够从项目下载页(http://www.slf4j.org/download.html)下载SLF4J绑定。

在类途径下发现多个绑定

SLF4J被规划成顺次与每个且只要一个根本日志结构绑定。假如在类途径下存在不止一个绑定。SLF4J将宣布一个正告,列出这些绑定的方位。

当多个绑定在类途径下,只能选择一个你想用的绑定,移除别的绑定。比方,假如在类途径下一起有slf4j-simple-1.7.19.jar和

slf4j-nop-1.7.19.jar,你想用无操作绑定,那么把slf4j-nop-1.7.19.jar从类途径中移除。

这个SLF4J供给的正告信息方位列表 为识别过渡添加到项目中不想要的SLF4J绑定依靠包

供给了有用的信息。在项目中pom.xml文件中,剔除掉那些随意声明的依靠包下的SLF4J绑定。例如,cassandra-all版别0.0.1一起把log4j和slf4j-log4j12声明为编译时刻相关。由此,当你把cassandra-all作为依靠包包含到你的项目中,cassandra-all声明将致使log4j和slf4j-log4j12一起被添加为依靠包。假使SLF4J在后台时,你不想用log4J,你能够通知Maven这俩个文件,如下文显现:

 

org.apache.cassandra

cassandra-all

0.8.1

org.slf4j

slf4j-log4j12

log4j

log4j

留意:SLF4J宣布的正告仅仅正告。甚至多个绑定存在时,SLF4J将选择一个日志结构/完成,然后与它绑定。SLF4J选择绑定的方式由java虚拟机决议,应当随机思考一切的实践意图。1.6.6版别,SLF4J会以结构/完成类的实践规模命名。

例如类库或结构的这些嵌入的组件不能声明任何SLF4J的绑定,除了依靠slf4j-api。当一个包库在SLF4J绑定上声明一个编译时刻依靠,它会诈骗你而且绑定到最后的用户,这么就与

SLF4J的意图各走各路了。当你遇到嵌入组件在SLF4J绑定上声明编译时刻依靠,请及时联络这些作者,友爱地请他们修正这些办法。

Slf4j-api版别不匹配绑定

SLF4J绑定标明人工打的jar包,例如用来把slf4j绑定到根本日志结构的slf4j-jdk14.jar

或 slf4j-log4j12.jar,java.util.logging和个别log4j。

混用不相同版别的slf4j-api.jar和SLF4J绑定会致使疑问。例如,假如你用slf4j-api-1.7.19.jar,然后你也应当用slf4j-simple-1.7.19.jar,用slf4j-simple-1.5.5.jar将不起作用。

留意: 从客户端的视点,一切版别的slf4j-api版别都是兼容的。在恣意N和M版别slf4j-api下,经过slf4j-api-N.jar编译的客户端代码在slf4j-api-M.jar下也将运转良好。你只需断定绑定版别匹配slf4j.jar。你不需求忧虑项目中已给出的依靠库slf4j-api的版别。你能用恣意slf4j-api.jar版别,只要slf4j-api.jar版别和它的绑定匹配,就不会有疑问。

在初始化时,假如SLF4J置疑有任任何api和绑定版别不匹配疑问,它将宣布被疑似不匹配的正告信息。

日志工厂完成不能为空

这个过错在LoggerFactory类找不到适宜的绑守时会陈述。在类途径下放置slf4j-nop.jar,

slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar

或logback-classic.jar中的一个包(只能放一个),这会是个有用的改正办法。

在类途径下检查log4j-over-slf4j.jar和

slf4j-log4j12.jar包,代替堆溢出过错

slf4j-log4j12

模块的意图是把从log4j日志到SLF4J的调用搬运或重定向。Log4j-over-slf4j模块的意图是把从Log4j-over-slf4j日志到SLF4J的日志记载重定向。假如SLF4J归于slf4j-log4j12.jar和slf4j-log4j-over-slf4.jar,也会在呈如今类途径中,堆溢出过错必定会在首次调用SLF4J或log4j日志时呈现。

如下是相似的反常:

Exception in thread "main"

java.lang.StackOverflowErrorat

java.util.Hashtable.containsKey(Hashtable.java:306)at

org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:36)at

org.apache.log4j.LogManager.getLogger(LogManager.java:39)at

org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)at

org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)at

org.apache.log4j.Category.(Category.java:53)at

org.apache.log4j.Logger..(Logger.java:35)at

org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:39)at

org.apache.log4j.LogManager.getLogger(LogManager.java:39)at

org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)at

org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)at

org.apache.log4j.Category..(Category.java:53)at

org.apache.log4j.Logger..(Logger.java:35)at

org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:39)at

org.apache.log4j.LogManager.getLogger(LogManager.java:39)subsequent lines

omitted...

SINCE 1.5.11

 SLF4j代替了必定发作的堆溢出过错,经过抛出一个对于疑问实践状况的概况的反常。这比让用户去想堆溢出过错的因素要好多了。

更多别的对于这个主题的更多布景,检查Bridging legacy

APIs(http://www.slf4j.org/legacy.html)。

在类途径下检查jcl-over-slf4j.jar 和

slf4j-jcl.jar包,代替堆溢出过错

slf4j-jcl模块的意图是把从SLF4J到JCL(jakarta commons

logging)的调用搬运或重定向。jcl-over-slf4j模块的意图是从JCL日志到SLF4J的日志记载搬运或重定向。假如SLF4J归于jcl-over-slf4j.jar和slf4j-jcl.jar,也会在呈如今类途径中,堆溢出过错必定会立即在首次调用SLF4J或JCL日志时呈现。

如下是相似的反常:

Exception in thread "main"

java.lang.StackOverflowErrorat java.lang.String.hashCode(String.java:1482)at

java.util.HashMap.get(HashMap.java:300)at

org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:67)at

org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)at

org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)at

org.apache.commons.logging.LogFactory.getLog(LogFactory.java:289)at

org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:69)at

org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)at

org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)subsequent

lines omitted...

从版别 1.5.11开端

 SLF4j代替了必定发作的堆溢出过错,经过抛出一个对于疑问实践状况的概况的反常。这比让用户去想堆溢出过错的因素要好多了。

更多别的对于这个主题的更多布景,检查Bridging legacy APIs

加载类” org.slf4j.impl.StaticMDCBinder”失利

这个过错表明在类途径下没找到适宜的SLF4J绑定。在类途径下放置slf4j-nop.jar,

slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar

或logback-classic.jar中的一个包(只能放一个)会处理这个疑问。

MDCAdapter不能为空

当org.slf4j.MDC

class类没有被准确地初始化时会陈述此过错。像上面已列出的项相同的状况和改正方案。

在初始化期间拦截一定数量(N)的日志记载,如今从头显现。这些遵从底层日志体系过滤规矩

从1.7.版别,在初始化期间发作的日志记载被记载下来,然后在初始化完成后从头显现。留意从头显现的日志记载遵从底层日志体系过滤规矩。

原则上,使用中从头显现呈如今首次日志记载发作时,这时多线程现已发动。

检查substitute loggers

在底层日志体系的默许装备期间创立代替日志器

像logback和log4j这么的高档可装备日志体系,它们会在本身初始化进程中创立可调用日志器的组件。检查典型的事情LOGBACK-127(http://jira.qos.ch/browse/LOGBACK-127),它不也许完成这么的日志创立请求。

为了防止这种鸡和蛋疑问,在这个进程中(初始化),SLF4J创立了代替日志器。在此期间代替日志器的记载被简单地扔掉了。在初始化完成后,代替日志器将搬运记载早适宜的日志器完成,否则将会作用在LogFactory回来的日志器上。

假如已创立任何代替日志器,SLF4J将宣布一个日志的列表。这个列表意欲让你知道在初始化进程中被这些日志器扔掉的任何日志记载。

检查intercepted and replayed logging calls

SLF4J

1.4.0版别,需求1.2.12及以上的版别

在2005.8.29发布的log4j1.2.12版别增加了盯梢等级。在2007.5.16的SLF4J

API中增加了盯梢等级。这么,,发动SLF4J1.4.0时,绑定给SLF4J的log4j需求log4j1.2.12及其以上的版别。

当然,像在文件59陈述的相同(http://jira.qos.ch/browse/SLF4J-59),在你某些环境下,这也许会很难晋级log4j版别。为了处理这么的状况,SLF4J的Log4jLOggerAdapter将把盯梢等级指为调试等级。

java.lang.NoClassDefFoundError:

org/slf4j/event/LoggingEvent

Logback-classic version

1.1.4及其今后的版别需求1.7.15及其以上版别的slf4j-api。

类途径中的前期slf4j-api.jar,1.1.4及其今后的logback版别回来的企图内省的日志实例将致使相似于下面显现的NoClassDefFoundError。

Exception in thread "main"

java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEventat

java.lang.Class.getDeclaredMethods0(Native Method)at

java.lang.Class.privateGetDeclaredMethods(Class.java:2451)at

java.lang.Class.privateGetPublicMethods(Class.java:2571)at

java.lang.Class.getMethods(Class.java:1429)at

java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1261)at

java.beans.Introspector.getTargetMethodInfo(Introspector.java:1122)at

java.beans.Introspector.getBeanInfo(Introspector.java:414)at

java.beans.Introspector.getBeanInfo(Introspector.java:161)

在类途径下放置1.7.15及其以上的slf4j-api.jar包能够处理此疑问。

记住这个疑问只会呈如今1.1.4及其今后的logback版别,别的的绑定,例如slf4j-log4j,

slf4j-jdk14 and slf4j-simple是不受影响的。

优质IT资源分享社区为你提供此文。

本站有大量优质Java教程视频,资料等资源,包含java基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

java教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客