我正在尝试在Weblogic12下配置sl4j / logback。
我部署了ear文件,它有war文件,有WEB-INF \ classes \ 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>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
我的日志代码:
private static final Logger logger = LoggerFactory.getLogger(FrontEndServlet.class);
//......
logger.info("info test");
logger.debug("debug test");
logger.error("error test");
我在标准输出中看到的是:
ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost
INFO: info test
ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost
SEVERE: error test
因此,看起来配置文件没有被选中。 我究竟做错了什么?
答案 0 :(得分:21)
这里详细讨论了这个问题:https://stagingthinking.wordpress.com/2012/06/02/annoying-slf4j-problem-in-weblogic-server-12c/
您需要放入prefer-application-packages机制的确切包是org.slf4j
,如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<weblogic-application>
<prefer-application-packages>
<package-name>org.slf4j</package-name>
</prefer-application-packages>
</weblogic-application>
答案 1 :(得分:8)
注意:此问题已经得到解答,我想补充一点,您还应该添加prefer-application-resources
。
答案:在您的耳边添加一个名为META-INF / weblogic-application.xml的文件,其中包含prefer-application-packages
和prefer-application-resources
!
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application
xmlns="http://xmlns.oracle.com/weblogic/weblogic-application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.5/weblogic-application.xsd"
version="6">
<!-- http://www.torsten-horn.de/techdocs/jee-oracleweblogic.htm -->
<prefer-application-packages>
<package-name>org.slf4j.*</package-name>
</prefer-application-packages>
<!-- if not using prefer-application-resources you will get a warning like this: -->
<!-- Class path contains multiple SLF4J bindings -->
<!-- SLF4J: Found binding in [jar:file:/C:/wls1211/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] -->
<prefer-application-resources>
<resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name>
</prefer-application-resources>
</weblogic-application>
答案 2 :(得分:6)
问题是 - sl4j没有获取logback而是使用了Weblogic的slf4j-jdk日志记录。可以使用Weblogic的配置 weblogic-application.xml 修复,选项 prefer-application-packages
答案 3 :(得分:1)
或者,如果您遇到的问题不仅仅是slf4j,您可以使用
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
而不是
<prefer-application-packages>
<package-name>org.slf4j.*</package-name>
</prefer-application-packages>
来源:Oracle
答案 4 :(得分:1)
环境: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服务器日志。在slf4j中只能有一个绑定,虽然很多框架可以路由到那个绑定,(我发现this图有用)Weblogic 12.2.1只使用Java util日志绑定,没有办法(在应用程序配置级别)连接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>
希望我可以拯救他人一些我试图以我想要的方式工作的痛苦。