【问题标题】:Logback RollingFileAppender does not log Hibernate messagesLogback RollingFileAppender 不记录 Hibernate 消息
【发布时间】:2014-08-30 05:17:13
【问题描述】:

我有以下 logback.xml:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

<appender name="FILE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>C:/logs/external-web-services.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>C:/logs/external-web-services.%d{yyyy-MM-dd}.log
        </fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <append>true</append>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

<logger name="org.hibernate.SQL" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="FILE" />
</logger>

<logger name="org.hibernate.type" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="FILE" />
</logger>

<root level="DEBUG">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
</root>

我想在我的日志文件中记录 Hibernate sql 查询。从 Eclipse 运行时,我只在控制台中看到 Hibernate 查询(也在 JBoss 日志文件 server.log 中,但这是我不明白的其他内容)。在我的日志文件 (external-web-services.log) 中,仅打印我的日志消息。从未打印过任何休眠消息。在eclipse中我得到以下信息:

11:50:05,367 INFO  [stdout] (default task-9) Hibernate: 
11:50:05,367 INFO  [stdout] (default task-9)     select
11:50:05,367 INFO  [stdout] (default task-9)         ftibssettl0_.settlcycleinstanceid as settlcycleinstance1_3_,
11:50:05,367 INFO  [stdout] (default task-9)         ftibssettl0_.endtime as endtime2_3_,
11:50:05,367 INFO  [stdout] (default task-9)         ftibssettl0_.PARTSET_0_PART as PARTSET_3_3_,
11:50:05,367 INFO  [stdout] (default task-9)         ftibssettl0_.PARTSET_1_PART as PARTSET_4_3_,
11:50:05,367 INFO  [stdout] (default task-9)         ftibssettl0_.PARTSET_2_PART as PARTSET_5_3_,
11:50:05,367 INFO  [stdout] (default task-9)         ftibssettl0_.PARTSET_3_PART as PARTSET_6_3_,
11:50:05,367 INFO  [stdout] (default task-9)         ftibssettl0_.PARTSET_4_PART as PARTSET_7_3_,
11:50:05,367 INFO  [stdout] (default task-9)         ftibssettl0_.settlcycletemplateid as settlcycletemplate8_3_,
11:50:05,368 INFO  [stdout] (default task-9)         ftibssettl0_.settlementdate as settlementdate9_3_,
11:50:05,368 INFO  [stdout] (default task-9)         ftibssettl0_.starttime as starttime10_3_,
11:50:05,368 INFO  [stdout] (default task-9)         ftibssettl0_.status as status11_3_ 
11:50:05,368 INFO  [stdout] (default task-9)     from
11:50:05,368 INFO  [stdout] (default task-9)         ibsprod.FT_IBS_SETTL_CYCLE_INSTANCE ftibssettl0_ 
11:50:05,368 INFO  [stdout] (default task-9)     where
11:50:05,368 INFO  [stdout] (default task-9)         ftibssettl0_.settlementdate=?

11:50:05,417 INFO  [stdout] (default task-9) 11:50:05.417 [default task-9] DEBUG g.d.n.s.CashMovementReportService - filterAndMarkCashMovements elapsed time: PT0.017S

这个日志比较奇怪的是Hibernate消息的格式不是我在logback.xml编码器模式中定义的格式,可以看日志的最后一行,也就是我的应用程序的日志消息

其他信息:

我正在使用 JBoss,所以我需要排除 JBoss 自己的日志记录子系统,以便 logback 工作,我正在使用文件 jboss-deployment-structure.xml:

<jboss-deployment-structure>
  <deployment>
    <exclude-subsystems>
        <subsystem name="logging" />
    </exclude-subsystems>
  </deployment>
</jboss-deployment-structure>

我正在使用 JPA,所以如果这可能有帮助,这是我的 persistence.xml 文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">

<persistence-unit name="external-ws" transaction-type="JTA">
    <description>Oracle Persistence Unit</description>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>${ds.name}</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.default_schema" value="${ds.schema}"/>
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="org.hibernate.flushMode" value="manual"/>
    </properties>
</persistence-unit>

【问题讨论】:

    标签: java hibernate jpa jboss logback


    【解决方案1】:

    尝试添加:

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>TRACE</level>
    </filter>
    

    到 CONSOLE 和 FILE 附加器。默认阈值为 WARN。

    您还可以检查这是否是 log4j 使用的配置文件。由于类加载未命中配置,可能会加载不同的文件。

    ch.qos.logback.classic.util.ContextInitializer 有一个:

    public void configureByResource(URL url) {
    

    您可以尝试在运行时调试以检查实际加载的配置文件的方法。

    另外,请尝试删除:

    <property name="hibernate.show_sql" value="true" />
    <property name="hibernate.format_sql" value="true" />
    

    因为那些应该只打印到控制台。

    【讨论】:

    • 我不确定我是否明白你在说什么。澄清一下,我没有使用 log4j,我使用的是 logback。此外,文件被正确拾取我知道这是因为我自己的消息被正确记录。例如,当我将根级别更改为 INFO 时,我看不到我的 DEBUG 消息。问题在于未记录在文件中的休眠消息。
    • 我更新了我对 logback 的回复。如果您的配置更改可见,则意味着 logback 选择了正确的文件。检查我的更新回复。
    • 我刚刚意识到从 Hibernate 打印到控制台的内容是由于 persistence.xml 文件属性而不是因为我的 logback.xml 配置而打印的。当我删除 时,控制台中也没有打印任何内容
    • 我尝试了过滤器,但在日志或控制台中没有看到任何不同
    • JBoss 没有找到 slf4j-api。您需要检查您的全局库或项目 pom.xml 文件是否存在此依赖关系。对于 Masven,请尝试“mvn dependency:tree”
    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2018-01-27
    • 2016-06-06
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多