Log4j + 休眠 5 + Weblogic 12.2.1

Log4j + Hibernate 5 + Weblogic 12.2.1

我使用 Hibernate 5.2。10.Final、log4j 1.2.17(来自 here)、Weblogic 12.2.1。这就是我的 log4j.xml 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%5p] %d{yyyy-MM-dd HH:mm:ss} [%x] [%C.%M] - %m %n" />
        </layout>
    </appender>

    <appender name="logFile" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="../logs/mylog.log"/>
        <param name="MaxFileSize" value="100MB"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="[%5p] %d{yyyy-MM-dd HH:mm:ss} - %m %n" />
        </layout>
    </appender>

    <logger name="interceptorLog" additivity="false">
        <level value="INFO" />
        <appender-ref ref="logFile" />
    </logger>

    <root>
        <priority value="ALL" />
        <appender-ref ref="logFile"/>
    </root>

</log4j:configuration>

现在,我自己的所有日志记录都转到 mylog.log - 没关系。当一些 Hibernate 异常发生时,这些日志转到 <weblogic-domain>/servers/AdminServer/MyApplication.log,我想要的是让它们转到与我的日志相同的文件。

此时我基本上尝试了一切:迁移到 log4j2(在 this 之后),将休眠 loggers/categories 添加到我的 log4j.xml,例如:

<logger name="org.hibernate">
    <level value="ALL" />
    <appender-ref ref="logFile"/>
</logger>

一点进展都没有,不管我怎么改都好像没有效果(当然除非我犯了一些错误)。我开始认为 Weblogic 是幕后黑手,我猜 Hibernate 日志进入错误输出并且 Weblogic 正在将它们重定向到他的文件,不知道为什么我不能强制它们登录 mylog.log.

我最关心的是异常,我希望将它们与我所有的自定义日志一起查看,而不是隐藏在 Weblogic 域文件中的某个地方。

在不完全理解其 class 加载机制的情况下处理 Java EE 应用程序服务器(尤其是 WLS)有时会令人沮丧。长话短说,为了使它与 WLS 12 一起工作,您需要指示 WebLogic 使用您的应用程序库中的首选 org.jboss.logging.* 包(来自 jboss-logging;hibernate-core 的依赖项)部署描述符(weblogic.xml)。你可以阅读它 here.

一个可以帮助你的例子:

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
     http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app
 http://xmlns.oracle.com/weblogic/weblogic-web-app/1.9/weblogic-web-app.xsd">

<wls:weblogic-version>12.2.1.2.0</wls:weblogic-version>

<wls:context-root>example</wls:context-root>

<wls:container-descriptor>
    <wls:prefer-application-packages>
        <wls:package-name>org.springframework.*</wls:package-name>
        <wls:package-name>org.hibernate.*</wls:package-name>
        <wls:package-name>org.apache.*</wls:package-name>
        <wls:package-name>javax.validation.*</wls:package-name>
        <wls:package-name>com.fasterxml.jackson.*</wls:package-name>
        <wls:package-name>org.slf4j.*</wls:package-name>
        <wls:package-name>org.jboss.logging.*</wls:package-name>
    </wls:prefer-application-packages>
    <wls:prefer-application-resources>
        <wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name>
    </wls:prefer-application-resources>
</wls:container-descriptor>

以上配置使用 SLF4J 作为日志记录 API 和新的 Log4J (log4j2) 作为日志记录后端。但是,即使您直接使用 Log4J(请注意,旧的 log4j 现在已被弃用),这也应该为您完成。