当前位置: 首页 > 知识库问答 >
问题:

如何在Tomcat+Hibernate中使用SLF4J/Logback进行日志记录

赵永逸
2023-03-14

因此,我正在部署一个使用Hibernate4.3.6的web应用程序。和Tomcat 7。我正在尝试使用SLF4J作为日志抽象层来日志。但是,我有很多问题和疑问。首先,Hibernate和Tomcat都有不同的日志框架,分别是jboss-logging和juli(即使我在库中找不到juli),所以我认为我必须安装从这些框架到SLF4J的桥梁。对于Hibernate,根据这个答案,一个解决方案可以是使用SystemProperty。但是,如果我不设置这个,

它尝试jboss、然后是log4j、然后是slf4j(仅在使用logback的情况下)并回退到JDK。所以,也许这就是我想要的:不要设置SystemProperty并让它选择SLF4J。

对于Tomcat,我认为我必须简单地将jul-to-slf4j和tomcat-juli jar添加到构建路径中。因此,此刻,我在构建路径上有这样一个罐子:

  • SLF4J-API-1.7.7
  • logback-classic-1.1.2
  • 日志-核心-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");
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)

即使将“-dorg.jboss.logging.provider=slf4j”添加到VM参数中,错误消息也保持不变。那么,我该如何解决问题呢?

编辑

将jboss-logging重新添加到类路径中,错误就消失了。问题是现在我有很多消息来自logback、jboss-logging和juli。而且,直到现在还没有创建任何文件,即使我在logback.xml中指定了一个文件;相反,它继续使用默认模式写入控制台(实际上,它不打印logback.xml中指定的日期)。这是一个日志输出的示例,您可以很容易地识别来自不同记录器的消息(logback从小时开始,jboss-logging从hibernate开始,而juli从debug级别开始)

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

在Tomcat的system installation文件夹中部署应用程序(而不是Eclipse使用的那个),所有的juli文件都被写入catalina.[date].log,而来自jboss-logging和logback的日志则被写入catalina.out。似乎根本无法识别logback.xml文件。

编辑3好吧,问题之一似乎是logback.xml的位置。我已经把它放在一个子文件夹中,而它应该直接放在WEB-INF/classs下面。现在它将登录到正确的目录。但是,Hibernate和Tomcat仍然继续将它们的日志消息写入System.out(并因此写入Catalina.out)。

编辑4确定,我禁用了对stdout的Hibernate输出,从Hibernate.cfg.xml中删除了 true 。现在,我的问题是:tomcat是否可以继续打印类似于

Dec 07, 2014 7:46:59 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]

在控制台上?

共有1个答案

秋向阳
2023-03-14

我知道日志记录有两个问题--Hibernate日志记录和tomcat日志记录

>

  • 对于hibernate,您必须在类路径中包含jboss-logging jar,因为JBoss日志只是一个日志外观。要配置记录器,例如使用/添加处理程序,您需要一个日志管理器,如JBoss日志管理器,即J.U.L。日志管理器、logback或log4j。只要包含此库就可以解决您的问题。

    对于tomcat日志记录,您可能必须在$CATALINA_HOME/CONF/logging.properties中指定slf4j配置

  •  类似资料:
    • 我在具有以下logback.xml文件的类路径中有slf4j和logback jar(该文件以前已经成功使用过)。但是,DOCX4J3.0仍然将日志记录信息打印到标准输出。我正在使用NetBeans7.4构建基于docx4j的应用程序。我想将日志级别更改为错误,并将其发送到日志文件中。不知道我错过了什么。任何帮助都是非常感谢的。

    • 问题内容: 我已经将一个Web应用程序部署到服务器上。我的应用程序使用和。但是,并非所有日志记录消息都已写入文件。 在我的课堂上,我有: 我的文件在本地计算机上运行良好,并且已正确部署。 我看到正在写入的应用程序生成的错误消息没有写入我的。由于输出模式的格式与我的模式不同,因此看起来的日志消息来自其他日志框架。我在中看到的日志记录如下: 我的log4j模式是这样的: 一些日志记录出现在我的文件日志

    • 问题内容: 许多人不确定如何将Liquibase的日志记录修复到控制台或文件中。 是否可以将liquibase日志记录到slf4j? 问题答案: 有,但是有点模糊。使用SLF4J和Log4J引用修复的liquibase日志记录: 有 简单的方法 ,通过在依赖下降: 现在,前两个是您的日常日志记录框架(slf4j api和log4j实现)。这些是您对标准log4j依赖项的补充,因为它们所做的只是路由

    • 问题内容: 我正在迁移一个曾经使用log4j进行logback / slf4j的应用程序,并且已经出现问题约2周了……我做了一个小项目来测试logback / slf4j,它的工作效果很好,但是由于某种原因,在应用它时到实际的应用程序,它只是不想工作。 我正在使用JBoss 6.2,将EAR部署到standalone / deployments目录并启动服务器(除了我得到这个异常的事实,这一切都很

    • Hibernate 3. x使用slf4j进行日志记录。Hibernate 4. x使用jboss日志记录。我正在编写一个使用Hibernate 4和SLF4J进行日志记录的独立应用程序。 如何配置Hibernate以登录到SLF4J? 如果这不可能,我如何配置Hibernate的日志记录? Hibernate 4.1关于日志记录的手动部分以警告开始,它是。。。 完全过时了。Hibernate从4

    • 问题内容: 我想将“跟踪”消息添加到我的所有公共方法中,如下所示: 现在,我想使用AOP(和字节码检测)将所有这些自动添加到我的方法中。我在想。是否有意义?您知道任何开放源代码吗? 问题答案: 我创建了一个简单的方面来捕获公共方法的执行。该AspectJ代码的核心是切入点定义: 在这里,我们将捕获任何包,任何类,具有任意数量的参数,具有任何返回类型的所有公共方法。 建议执行可以在下面的代码段中可视