环境:Weblogic的12.2 .1 记录框架:SLF4J和的logback 要求:登录到我的选择(每个应用程序)的文件,以及Weblogic的服务器日志
使用在weblogic.xml中<prefer-application-packages/>
或<prefer-web-inf-classes>
没有满足要求。在我的测试,使用一个或其他标记(不能同时使用)会导致应用程序logback.xml被拾起,并记录将转到logback.xml定义的文件。但是,使用logback的ConsoleAppender的典型STDOUT定义将不会记录到服务器日志。
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
从weblogic中删除以下内容。xml
<wls:prefer-application-packages>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
将导致使用绑定的SLF4j绑定,它在Weblogic 12.2.1中是Java Util日志记录。在这种情况下,日志语句将转到服务器日志,而不是转到应用程序级别logback.xml中的文件定义。在我的研究中,它出现在一个时间中,WebLogic 12的某些版本允许内部SLF4J绑定到Log4j的,但在较小的版本之一已被删除。这是我的情况;我没有选择通过管理控制台将Log4j作为Weblogic中的主要日志记录框架。我相当肯定这不会对我有所帮助,但是我确实想记下它,因为我读过的几个文件表明这个文件可用。
大量的研究和战斗配置与weblogic.xml中,POM的配置(排除等),并尝试使用不同的绑定和桥梁后,我无法实现我想要的日志记录配置。看起来,Weblogic的slf4j被绑定到Java实用程序日志记录,不论好坏。如果你选择自己的实现SLF4J和绑定的(在我的情况的logback),没有办法,我可以通过配置找到路由到WebLogic Server日志的消息。在slf4j中只能有一个绑定,尽管许多框架可以路由到那个绑定(我发现this图很有用),但Weblogic 12.2.1只使用Java实用工具日志记录绑定,没有办法(在应用程序配置级别)连接Weblogic以使用您提供的Logback绑定登录到其服务器日志。可能有一些方法可以使用log4j和网桥来实现这一点,但对于我来说,这完全是太多的膨胀和配置来完成简单的日志记录任务。
放弃尝试通过配置克服这一点,我决定只写自己的logback appender,将日志事件转换为JUL日志记录事件。我用Logback的AppenderBase的own实现取代了许多Logback示例中的标准STDOUT定义。此时,我现在可以使用每个应用程序日志记录配置进行登录,并且还可以登录到Weblogic Server日志。
相关POM依赖关系:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
的weblogic.xml(这里注意,Hibernate内置了JbossLogging这将弥补自动SLF4J)
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/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.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/2.0/weblogic-web-app.xsd">
<jsp-descriptor>
<keepgenerated>true</keepgenerated>
<debug>true</debug>
</jsp-descriptor>
<context-root>YourContextRoot</context-root>
<wls:container-descriptor>
<wls:prefer-application-packages>
<wls:package-name>ch.qos.logback.*</wls:package-name>
<wls:package-name>org.jboss.logging.*</wls:package-name>
<wls:package-name>org.slf4j.*</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>
的logback AppenderBase实施
import java.util.logging.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class WeblogicAppender extends AppenderBase<ILoggingEvent> {
private final Logger logger = Logger.getLogger(WeblogicAppender.class.getName());
ILoggingEvent event = null;
@Override
protected void append(ILoggingEvent event) {
this.event = event;
logger.log(getJULLevel(), event.getFormattedMessage());
}
private java.util.logging.Level getJULLevel() {
if (this.event == null) {
return java.util.logging.Level.SEVERE;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.ALL) {
return java.util.logging.Level.ALL;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.DEBUG) {
return java.util.logging.Level.FINE;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.ERROR) {
return java.util.logging.Level.SEVERE;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.INFO) {
return java.util.logging.Level.INFO;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.TRACE) {
return java.util.logging.Level.FINEST;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.WARN) {
return java.util.logging.Level.WARNING;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.OFF) {
return java.util.logging.Level.OFF;
} else {
return java.util.logging.Level.INFO;
}
}
}
Logback.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="com.your.package.WeblogicAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern>
</encoder>
</appender>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>yourlog.log
</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>yourlog.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxFileSize>25MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern>
</encoder>
</appender>
<root level="TRACE">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
希望我能救别人一些,我通过努力得到这个工作,我想要的方式去痛的。
当你解释如何以及哪些文件需要使用,这是非常明确的。谢谢! – ferreirabraga