2012-03-16 18 views
11

Chúng tôi đang tạo systen mới bằng cách sử dụng slf4j làm mặt tiền ghi nhật ký. Khi triển khai trên mới WebLogic 12c, chúng tôi thấy lỗi này trên console log:Ngăn chặn Weblogic 12c sử dụng liên kết slf4j của hệ thống

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/opt/Oracle/Middleware2/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [zip:/opt/Oracle/Middleware2/user_projects/domains/m3/servers/AdminServer/tmp/_WL_user/test/t030q4/war/WEB-INF/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

sau khi googling, chúng tôi thấy rằng đây chỉ là một cảnh báo, slf4j sẽ ràng buộc đầu tiên tìm thấy logger, mà trong trường hợp này là khuôn khổ hệ thống logger WebLogic của . Có cách nào để làm cho nó liên kết với khung khai thác gỗ trong tệp WAR của chúng ta không? Có < thích-web-inf-lớp học > trong weblogic.xml không giúp

Trả lời

0

Tôi không tin SLF4J cung cấp một cách để buộc phiên bản riêng của nó, vì nó dựa trên tự khám phá trong classpath này.

Vì vậy, nếu bạn có quyền quản trị trên WebLogic, giải pháp đơn giản nhất là nâng cấp phiên bản SLF4J của WebLogic lên 1.6.4 bằng cách cập nhật tệp trên thư mục cài đặt WebLogic.

Nếu không, bạn có thể thử xây dựng một EAR thay vì WAR và làm theo các khuyến nghị here, mặc dù tôi nghi ngờ nó sẽ hoạt động nếu thích-web-inf-lớp học không hoạt động trong WAR.

+0

eh, ý tôi là "tạo slf4j bind logger để đăng nhập thư viện do tôi cung cấp thay vì liên kết với thư viện hệ thống". Điều đó không liên quan đến phiên bản của slf4j, vì chuyển sang 1.6.1 lỗi này xảy ra, và theo tài liệu của slf4j, khi slf4j tìm thấy nhiều logger ràng buộc, nó sẽ liên kết với logger đầu tiên, luôn luôn ràng buộc slf44 của hệ thống – dhchen

2

Chúng tôi cũng gặp sự cố này và vì chúng tôi được yêu cầu định cấu hình ghi nhật ký bằng Log4J, đây là vấn đề. Tuy nhiên, sử dụng prefer-application-packages dường như làm việc cho đến nay, tức là đặt một tập tin weblogic-application.xml trong thư mục META-INF của EAR như sau:

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-application.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd" > 
    <prefer-application-packages> 
     <package-name>org.slf4j</package-name> 
    </prefer-application-packages> 
</weblogic-application> 

(ok xmlns quy định là một cũ nhưng nó hoạt động, bạn có thể cập nhật nó nếu bạn muốn, tôi chỉ lấy của chúng tôi và loại bỏ các bộ phận không liên quan).

Chúng tôi vẫn có cảnh báo nói trên nhưng nó sử dụng Log4J theo yêu cầu. Trong thực tế, nếu bạn nhìn vào the URL specified on the next line trong nhật ký (bỏ qua ở đây trong câu hỏi), nó nói:

Cảnh báo phát ra bởi SLF4J chỉ là một cảnh báo. SLF4J sẽ vẫn liên kết với khung đầu tiên mà nó tìm thấy trên đường dẫn lớp.

Vì vậy, tôi đoán nó vẫn sử dụng cơ chế đẳng cấp tải bình thường để tải org.slf4j.impl.StaticLoggerBinder, mà chúng tôi thực sự cấu hình để thích một trong EAR của chúng tôi (ví dụ: làm cho nó là người đầu tiên trên classpath).

Tuy nhiên, cảnh báo vẫn còn nhưng nó hoạt động. Việc sửa chữa cảnh báo sẽ tốt nhưng có thể không thực hiện được nếu không thay đổi các thư viện được cung cấp của WebLogic.

4

Đối với tệp WAR, bạn nên sử dụng prefer-application-packages trong weblogic.xml như được mô tả trong thisthis bài đăng.

Trong trường hợp của bạn nó sẽ là một cái gì đó giống như

<?xml version="1.0" encoding="UTF-8"?> 
<wls: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://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> 
    <wls:container-descriptor> 
     <wls:prefer-application-packages> 
      <wls:package-name>org.slf4j</wls:package-name> 
     </wls:prefer-application-packages> 
    </wls:container-descriptor> 
</wls:weblogic-web-app> 
27

Các lọc không nên được thực hiện trên lớp nhưng về tài nguyên, vì SLF4J trông cho StaticLoggerBinder.class như một nguồn lực và không phải là một lớp.

Bao gồm điều này trong ứng dụng weblogic của bạn.xml là tốt:

<wls:prefer-application-packages> 
    <wls:package-name>org.slf4j.*</wls:package-name> 
    <wls:package-name>org.apache.commons.*</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> 

và trình ghi nhật ký của bạn sẽ được sử dụng thay cho bộ ghi trong bộ nạp lớp hệ thống.

+3

Là org.apache. commons. * mục yêu cầu để làm SLF4J hoạt động? Nếu vậy, tại sao? –

+0

trễ vài ngày nhưng: com.apache.commons.logging. * – HRgiger

Các vấn đề liên quan