如何在Tomcat + Hibernate中使用SLF4J/logback记录日志

3
所以,我正在部署一个使用Hibernate 4.3.6和Tomcat 7的Web应用程序。我尝试使用SLF4J作为日志记录抽象层来记录日志。但是,我有很多问题和疑问。 首先,Hibernate和Tomcat都已经配备了不同的日志记录框架,分别是jboss-logging和juli(即使我找不到juli在库中)。 因此,我认为我必须安装这些框架到SLF4J的桥接器。 对于Hibernate,从这个答案中,一种解决方法可能是使用SystemProperty。然而,如果我不设置这个属性,
它会尝试使用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"]

在控制台上吗?
2个回答

2

我了解到日志记录有两个问题 - Hibernate日志记录和Tomcat日志记录

  1. 对于Hibernate,您需要在类路径中包含jboss-logging jar,因为JBoss Logging仅是一个日志门面。要配置日志记录器(例如使用/添加处理程序),您需要像JBoss Log Manager、J.U.L.日志管理器、Logback或Log4j这样的日志管理器。只需包含此库即可解决您的问题。

  2. 对于Tomcat日志记录,您可能需要在$CATALINA_HOME/conf/logging.properties中指定slf4j配置

    handlers = org.slf4j.bridge.SLF4JBridgeHandler

我假设您已将xml文件命名为logback.xml并将其放置在类路径中。


也发给@stackdev。好的,我将jboss-logging重新添加到类路径中,错误消失了。问题是现在有很多来自logback、jboss-logging和juli的消息。此外,我稍微修改了logback.xml文件,试图隔离来自logback的消息,但没有创建任何文件。相反,它继续写入控制台。 此外,我已经修改了logging.properties文件,但我不认为它现在被使用:我正在使用Eclipse在工作区元数据内部部署服务器。 - tigerjack
关于您遇到的大量消息问题,您能否将日志的快照和最新的logback.xml发布到http://pastebin.com/,以便正确理解问题。 - Andy Dufresne
抱歉,我之前没有写明,但我已经在编辑中添加了所有信息,同时我直接修改了logback.xml文件。 - tigerjack

0

jboss-logging 是 hibernate-core 的传递性依赖,所以 jboss-logging 的 jar 包应该在构建路径中。检查 Project>Deployment Assembly,并确保 Maven 依赖项出现在其中,它应该看起来像

enter image description here

还可以尝试Tomcat>Clean...。


不知道你是否看到了其他答案下的评论。顺便说一句,感谢你的时间。我认为问题之一是logback.xml文件位于WEB-INF / classes的子文件夹中。然而,我仍然有其他问题:实际上,Hibernate继续将其消息记录到stdout(结果在catalina.out上)。 - tigerjack

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