2012-05-14 26 views
12

Tôi đang cố định cấu hình sl4j/logback trong Weblogic12. tôi triển khai hồ sơ tai, trong đó có tập tin chiến tranh, trong đó có thư mục WEB-INF \ Classes \ logback.xml
Dưới đây là cấu hình: sl4j/logback theo 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> 

Mã của tôi để đăng nhập:

private static final Logger logger = LoggerFactory.getLogger(FrontEndServlet.class); 
//...... 
logger.info("info test"); 
logger.debug("debug test"); 
logger.error("error test"); 

Những gì tôi thấy trong đầu ra standart là:

ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost 
INFO: info test 
ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost 
SEVERE: error test 

Vì vậy, có vẻ như tệp cấu hình không được chọn. Tôi đang làm gì sai?

Trả lời

6

Vấn đề là - sl4j không nhận logback và sử dụng nhật ký slf4j-jdk của Weblogic thay thế. Có thể được cố định với cấu hình WebLogic của WebLogic-application.xml, tùy chọn thích-ứng dụng-gói

19

Vấn đề được thảo luận ở đây một cách chi tiết: https://stagingthinking.wordpress.com/2012/06/02/annoying-slf4j-problem-in-weblogic-server-12c/

Các gói phần mềm chính xác mà bạn cần phải đặt với cơ chế gói ứng dụng ưu tiên là org.slf4j, như sau:

<?xml version='1.0' encoding='UTF-8'?> 
<weblogic-application> 
    <prefer-application-packages> 
    <package-name>org.slf4j</package-name> 
    </prefer-application-packages> 
</weblogic-application> 
6

Lưu ý: Ngoài ra câu hỏi này đã được trả lời, tôi muốn thêm rằng bạn cũng nên thêm prefer-application-resources.

Trả lời: Thêm một tập tin gọi là META-INF/WebLogic-application.xml vào tai của bạn, chứa cả 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

Điều rất rõ ràng khi bạn giải thích cách thức và tệp nào cần được sử dụng. Cảm ơn bạn! – ferreirabraga

0

Ngoài ra hoặc nếu bạn có vấn đề với hơn chỉ slf4j, bạn có thể sử dụng

<wls:container-descriptor> 
    <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes> 
</wls:container-descriptor> 

Thay vì

<prefer-application-packages> 
    <package-name>org.slf4j.*</package-name> 
</prefer-application-packages> 

Nguồn: Oracle

0

Môi trường: WebLogic 12,2 .1 Ghi nhật ký Khung: SLF4J và Logback Yêu cầu: Đăng nhập vào một tập tin lựa chọn của tôi (cho mỗi ứng dụng) cũng như các bản ghi máy chủ WebLogic

Sử dụng <prefer-application-packages/> hoặc <prefer-web-inf-classes> trong weblogic.xml đã không đáp ứng yêu cầu. Trong thử nghiệm của tôi, sử dụng một hoặc các thẻ khác (bạn không thể sử dụng cả hai) sẽ dẫn đến logback.xml ứng dụng được chọn và việc ghi nhật ký sẽ đi đến tệp được định nghĩa trong logback.xml. Tuy nhiên, sự phá hủy STDOUT điển hình bằng cách sử dụng ConsoleAppender của logback sẽ không đăng nhập vào nhật ký máy chủ.

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 

Xóa thông tin sau khỏi weblogic.xml

<wls:prefer-application-packages> 
    <wls:package-name>org.slf4j.*</wls:package-name> 
</wls:prefer-application-packages> 

sẽ dẫn đến việc sử dụng liên kết SLF4j đi kèm, trong Weblogic 12.2.1, là ghi nhật ký Java Util. Trong trường hợp này, các báo cáo tường trình sẽ đi tới các nhật ký máy chủ và không đến định nghĩa tệp trong tệp logback.xml cấp ứng dụng. Trong nghiên cứu của tôi, nó xuất hiện cùng một lúc, một số phiên bản của Weblogic 12 cho phép SLF4j nội bộ bị ràng buộc với Log4j nhưng đã bị loại bỏ trong một trong các phiên bản nhỏ. Đây là trường hợp của tôi; Tôi không có tùy chọn bật Log4j làm Khung ghi nhật ký chính trong Weblogic thông qua Bảng điều khiển dành cho quản trị viên. Tôi khá chắc chắn điều này sẽ không giúp tôi, nhưng tôi đã muốn lưu ý nó bởi vì một số tài liệu tôi đọc chỉ ra điều này sẽ có sẵn.

Sau nhiều cấu hình nghiên cứu và chiến đấu với weblogic.xml, cấu hình POM (loại trừ vv) và cố gắng sử dụng các ràng buộc và cầu nối khác nhau, tôi không thể đạt được cấu hình ghi nhật ký mà tôi muốn. Có vẻ như slf4j của Weblogic bị ràng buộc với việc ghi nhật ký tiện ích Java, tốt hơn hoặc tệ hơn. Nếu bạn chọn thực hiện slf4j và ràng buộc của riêng bạn (trong trường hợp của tôi Logback), không có cách nào mà tôi có thể tìm thấy để định tuyến các thông điệp đó tới nhật ký máy chủ Weblogic thông qua cấu hình. Chỉ có một ràng buộc trong slf4j, và mặc dù nhiều khung công tác có thể được định tuyến tới một ràng buộc, (tôi thấy this sơ đồ hữu ích) Weblogic 12.2.1 chỉ sử dụng liên kết ghi nhật ký Java util, không có cách nào để (ở mức cấu hình ứng dụng) để nối Weblogic để sử dụng liên kết Logback mà bạn cung cấp để đăng nhập vào nhật ký máy chủ của nó. Có thể có một số cách để sử dụng log4j và bridge để thực hiện điều này, nhưng đối với tôi đó là quá nhiều bloat và cấu hình để thực hiện một nhiệm vụ đăng nhập đơn giản.

Từ bỏ việc cố gắng chinh phục điều này bằng cấu hình, tôi đã quyết định chỉ viết ứng dụng đăng nhập của riêng mình để dịch sự kiện ghi nhật ký thành sự kiện ghi nhật ký JUL. Tôi đã thay thế định nghĩa STDOUT chuẩn được thấy trong nhiều ví dụ về Logback với việc triển khai thực hiện own của Logback's AppenderBase. Tại thời điểm này tôi có thể đăng nhập bằng cách sử dụng mỗi cấu hình đăng nhập ứng dụng và cũng đăng nhập vào Nhật ký máy chủ Weblogic.

Dependencies POM liên quan:

<!-- 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 (Lưu ý ở đây rằng Hibernate đi kèm với JbossLogging mà sẽ là cầu nối để SLF4J tự động)

<?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 thực hiện

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; 
    } 
} 

}

cấu hình 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> 

Hy vọng rằng tôi có thể cứu người khác một số trong những nỗi đau mà tôi đã đi qua cố gắng để có được làm việc này theo cách tôi muốn.