2012-01-06 31 views
7

Tôi đã có cấu trúc thư mục sau trong tomcat 6:Nếu tôi thoát khỏi 'nhiều Bindings SLF4J' của tôi cảnh báo logging ngừng hoạt động

tomcat 
|-lib 
| |- logback-classic.jar 
| |- logback-core.jar 
| |- slf4j-api.jar 
| |- myState.jar 
|-shared 
| |-lib 
| | |- myStateLogback.xml 
|-webapps 
| |-myApp 
| | |-WEB-INF 
| | | |-logback.xml 
| | | |-lib 
| | | | |-jcl-over-slf4j.jar 
| | | | |-logback-classic.jar 
| | | | |-logback-core.jar 
| | | | |-slf4j-api.jar 

myState.jar cần phải sống trong tomcat/lib vì nó chứa các lớp cần thiết khi khởi động tomcat như một tài nguyên toàn cầu. Nó viết nó đăng nhập vào slf4j vì vậy cũng cần các slf4j và logback lọ. Nó sử dụng một JoranConfigurator để tải myStateLogback.xml.

myapp webapp ghi nhật ký của nó để ghi nhật ký, nhưng tôi muốn nó đi qua slf4j để đăng nhập để chuẩn bị chuyển tất cả nhật ký của chúng tôi sang slf4j, vì vậy tôi đang sử dụng cầu nối jcl-over-slf4j.

Với thiết lập ở trên, đăng nhập tất cả các công trình, nhưng tôi nhận được cảnh báo sau khi khởi động:

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/D:/tomcat/lib/logback-classic-0.9.29.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [jar:file:/D:/tomcat/webapps/myApp/WEB-INF/lib/logback-classic-0.9.29.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

Nếu tôi đưa ra logback-cổ điển của dir lib của webapp, tôi nhận được ngoại lệ sau đây:

Exception in thread "Timer-30" java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature 
     at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:284) 
     at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:252) 
     at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156) 
     at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132) 
     at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:272) 

Nếu tôi xóa 2 logback jars và slf4j-api.jar khỏi thư mục lib của webapp, tôi không nhận được cảnh báo và không có ngoại lệ, nhưng nhật ký từ webapp của tôi được chọn bởi tệp myStateLogback.xml và đi đến logger của nó, mà tôi không muốn. Tôi biết tôi có thể lọc ra các báo cáo tôi không muốn, nhưng tôi muốn có các tập tin cấu hình riêng biệt cho webapp và jar. Có cách nào để đạt được điều này?

Tôi đang sử dụng tomcat 6.0.23, logback 0.9.29 và slf4j 1.6.3.

Cảm ơn, Sarah

Trả lời

3

Có một chương có tựa đề logging separation trong documentaiton logback trong đó trình bày một giải pháp khả thi.

+0

Cảm ơn điều đó - rất thú vị và tôi nghĩ nó sẽ hoạt động trong tình huống này. Tuy nhiên, để giữ cho mọi thứ đơn giản, chúng tôi đã quyết định sử dụng đăng nhập tomcat juli cho myState.jar và sau đó đặt các logback/slf4j jars vào mỗi webapp để chúng kiểm soát việc ghi nhật ký của riêng chúng. – ssloan

1

Sử dụng tùy chọn -Dlogback.debug = true mới sẽ hiển thị thông báo từ những gì dường như là slf4j-api đang tìm kiếm các triển khai của nó. (Đăng nhập trông giống như một con thú cưng trong thế giới Java với tôi).

 
09:12:05,472 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 
09:12:05,472 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [jar:file:/home/FOO/BAR.jar!/logback-test.xml] 
09:12:05,487 |-INFO in [email protected] - URL [jar:file:/home/FOO/BAR.jar!/logback-test.xml] is not of type file 
09:12:05,656 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] 
09:12:05,662 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT] 
09:12:05,700 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property 
09:12:05,729 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.mongodb.morphia.mapping.Mapper] to ERROR 
09:12:05,729 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.BAZ] to DEBUG 
09:12:05,729 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO 
09:12:05,730 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT] 
09:12:05,730 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration. 
09:12:05,732 |-INFO in [email protected] - Registering current configuration as safe fallback point 
Các vấn đề liên quan