2012-05-14 59 views
12

我想在Weblogic12下配置sl4j/logback。 我耳朵部署文件,其中有战争文件,里面有WEB-INF \类\ logback.xml
下面是配置: sl4j/logback在weblogic

<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 

因此,它看起来像配置文件没有拿起。 我在做什么错?

回答

6

问题是 - sl4j没有选择logback,而是使用了Weblogic的slf4j-jdk日志记录。可以固定Weblogic的配置的weblogic-application.xml中,选择喜欢的应用程序的程序包

6

注:此外这个问题已经回答了,我想补充一点,你还应该加上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> 
+1

当你解释如何以及哪些文件需要使用,这是非常明确的。谢谢! – ferreirabraga

0

或者或者如果你有问题的不仅仅是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

0

环境: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> 

希望我能救别人一些,我通过努力得到这个工作,我想要的方式去痛的。