它会尝试使用jboss,然后是log4j,然后是slf4j(仅在使用logback时),最后回退到jdk。 因此,也许这就是我想要的:不设置SystemProperty并让它选择slf4j。
对于Tomcat,我认为我只需要将jul-to-slf4j和tomcat-juli jar添加到构建路径中。 因此,此时,在构建路径中有以下jar:
slf4j-api-1.7.7 logback-classic-1.1.2 logback-core-1.1.2 tomcat-juli-7.0.42 jul-to-slf4j-1.7.7
(我已经删除了jboss-logging和Hibernate默认的旧版slf4j,但没有删除tomcat-logging) 此外,我已经在我的项目中添加了这个xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug = "true">
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/var/lib/tomcat7/MyApp/MyLog.log</file>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
</appender>
<root level="trace">
<appender-ref ref="FILE" />
</root>
</configuration>
但我没有将它链接到任何资源上。我需要在web.xml中声明这个日志配置吗? 要在我的资源中调用SLF4J,我只需放置以下几行代码:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
private final static Logger LOG = LoggerFactory.getLogger(MyServlet.class);
...
LOG.debug("I'm logging");
然而,一切都不起作用。我继续收到来自Tomcat记录器的消息,而Hibernate抱怨它没有记录器;同时,我看不到任何来自slf4j / logback的日志记录。
SEVERE: Exception sending context initialized event to listener instance of class pervasive.com.gmail.tigerjack89.forum.server.controller.servlet.ContainerContext
java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2944)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1208)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569)
at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:192)
...
Caused by: java.lang.ClassNotFoundException: org.jboss.logging.BasicLogger
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1718)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569)
即使我在VM参数中添加了"-Dorg.jboss.logging.provider=slf4j",错误消息仍然保持不变。那么,我该如何解决这个问题?
编辑 将jboss-logging添加回类路径后,错误消失了。但问题是现在有许多来自logback、jboss-logging和juli的消息。并且,即使我在logback.xml中指定了一个文件,也没有创建任何文件;相反,它继续使用默认模式写入控制台(实际上,它不打印指定在logback.xml中的日期)。
这是日志输出的一个示例,您可以轻松地识别来自不同记录器的消息(logback以小时开始,jboss-logging以Hibernate:开头,而juli则以调试级别开头)。
16:50:01.331 [localhost-startStop-1] DEBUG org.hibernate.SQL -
select
subforums0_.parent_sub_forum as parent_s3_1_0_,
subforums0_.id as id1_1_0_,
subforums0_.id as id1_1_1_,
subforums0_.parent_sub_forum as parent_s3_1_1_,
subforums0_.title as title2_1_1_
from
subforum subforums0_
where
subforums0_.parent_sub_forum=?
Hibernate:
select
subforums0_.parent_sub_forum as parent_s3_1_0_,
subforums0_.id as id1_1_0_,
subforums0_.id as id1_1_1_,
subforums0_.parent_sub_forum as parent_s3_1_1_,
subforums0_.title as title2_1_1_
from
subforum subforums0_
where
subforums0_.parent_sub_forum=?
16:50:01.332 [localhost-startStop-1] DEBUG o.h.l.p.e.p.i.ResultSetProcessorImpl - Preparing collection intializer : [pervasive.com.gmail.tigerjack89.forum.shared.model.entities.Subforum.subforums#11]
16:50:01.337 [localhost-startStop-1] DEBUG o.h.e.l.i.CollectionLoadContext - 1 collections were found in result set for role: pervasive.com.gmail.tigerjack89.forum.shared.model.entities.Subforum.subforums
16:50:01.337 [localhost-startStop-1] DEBUG o.h.e.l.i.CollectionLoadContext - Collection fully initialized: [pervasive.com.gmail.tigerjack89.forum.shared.model.entities.Subforum.subforums#11]
16:50:01.337 [localhost-startStop-1] DEBUG o.h.e.l.i.CollectionLoadContext - 1 collections initialized for role: pervasive.com.gmail.tigerjack89.forum.shared.model.entities.Subforum.subforums
16:50:01.338 [localhost-startStop-1] DEBUG o.h.l.c.p.AbstractLoadPlanBasedCollectionInitializer - Done loading collection
16:50:01.338 [localhost-startStop-1] DEBUG o.h.e.t.spi.AbstractTransactionImpl - committing
16:50:01.339 [localhost-startStop-1] DEBUG o.h.e.i.AbstractFlushingEventListener - Processing flush-time cascades
16:50:01.346 [localhost-startStop-1] DEBUG o.h.e.i.AbstractFlushingEventListener - Dirty checking collections
16:50:01.361 [localhost-startStop-1] DEBUG o.h.engine.internal.Collections - Collection found: [pervasive.com.gmail.tigerjack89.forum.shared.model.entities.Subforum.subforumThreads#11], was: [pervasive.com.gmail.tigerjack89.forum.shared.model.entities.Subforum.subforumThreads#11] (uninitialized)
16:50:01.361 [localhost-startStop-1] DEBUG o.h.engine.internal.Collections - Collection found: [pervasive.com.gmail.tigerjack89.forum.shared.model.entities.Subforum.subforums#11], was: [pervasive.com.gmail.tigerjack89.forum.shared.model.entities.Subforum.subforums#11] (initialized)
16:50:01.362 [localhost-startStop-1] DEBUG o.h.e.i.AbstractFlushingEventListener - Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
16:50:01.362 [localhost-startStop-1] DEBUG o.h.e.i.AbstractFlushingEventListener - Flushed: 0 (re)creations, 0 updates, 0 removals to 2 collections
16:50:01.364 [localhost-startStop-1] DEBUG o.h.internal.util.EntityPrinter - Listing entities:
16:50:01.366 [localhost-startStop-1] DEBUG o.h.internal.util.EntityPrinter - pervasive.com.gmail.tigerjack89.forum.shared.model.entities.Subforum{subforumThreads=<uninitialized>, subforums=[], subforumParent=null, subforumId=11, subforumTitle=Main}
16:50:01.367 [localhost-startStop-1] DEBUG o.h.e.t.i.jdbc.JdbcTransaction - committed JDBC Connection
16:50:01.373 [localhost-startStop-1] DEBUG o.h.e.j.i.LogicalConnectionImpl - Releasing JDBC connection
16:50:01.373 [localhost-startStop-1] DEBUG o.h.e.j.i.LogicalConnectionImpl - Released JDBC connection
Dec 06, 2014 4:50:01 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Dec 06, 2014 4:50:01 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 5850 ms
编辑2
将应用部署到Tomcat的系统安装文件夹(而不是Eclipse使用的文件夹),所有juli文件都被写入catalina.[日期].log,而来自jboss-logging和logback的日志则被写入catalina.out。似乎logback.xml文件根本没有被识别。
编辑3 好吧,问题之一似乎与logback.xml的位置有关。我把它放在了子文件夹中,而它应该直接放在WEB-INF / classes下面。现在它可以记录到正确的目录了。然而,Hibernate和Tomcat仍然继续将它们的日志消息写入System.out(结果写入catalina.out)。
编辑4
好的,我通过从hibernate.cfg.xml中删除<property name="show_sql">true</property>
禁用了Hibernate输出到stdout。现在我的问题是:Tomcat是否继续打印像以下这样的消息?
Dec 07, 2014 7:46:59 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
在控制台上吗?