weblogic下的sl4j / logback

时间:2012-05-14 13:19:59

标签: weblogic slf4j logback

我正在尝试在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

因此,看起来配置文件没有被选中。 我究竟做错了什么?

5 个答案:

答案 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-packagesprefer-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>

希望我可以拯救他人一些我试图以我想要的方式工作的痛苦。