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 现在已被弃用),这也应该为您完成。
我使用 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 现在已被弃用),这也应该为您完成。