2012-03-29 28 views
5

Tôi đang cố gắng để tinh chỉnh một số chức năng logback (tùy chỉnh Appenders và muốn). Để kiểm tra nó, tôi muốn cấu hình Logback và gọi trực tiếp các phương thức ghi của nó mà không cần phải thông qua sl4j.Làm thế nào để sử dụng Logback trực tiếp mà không cần phải thông qua SLF4J

Lý do cho yêu cầu kỳ lạ này là có thể kiểm tra chức năng đăng nhập trong môi trường nơi có các cầu SLF4J khác.

Vì vậy, tôi muốn làm những thứ được mô tả ở đây: http://logback.qos.ch/manual/configuration.html#joranDirectly mà không có một tham chiếu đến SLF4J

Trả lời

3

đã không thử nó, nhưng có vẻ đúng, có lẽ nó sẽ giúp:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
ch.qos.logback.classic.Logger log = lc.getLogger(foo.Bar.class); 

Các ch.qos.logback.classic.Logger thực hiện org.slf4j.Logger nhưng bạn có thể sử dụng nó trực tiếp. Bạn có thể cần phải có được LoggerContext khác nhau.

+1

LoggerFactory là một phần của slf4j và sử dụng lớp StaticLoggerBinder đi kèm với các triển khai cầu khác nhau vì vậy tôi vẫn đang sử dụng cơ chế ràng buộc của slf4j với điều này. –

+0

@ JensSchauder: điều gì đơn giản là tạo ra 'mới LoggerContext() 'và tránh hoàn toàn SLF4J API? –

+1

Tôi đang phát triển một API, nơi tôi không thể sử dụng SLF4j ở tất cả, là nó có thể sử dụng logback độc lập? – Akhilesh

1

Thật không may, tôi không nghĩ rằng điều đó có thể xảy ra. Nếu bạn nhìn vào Logback Logger source (hoặc các lớp khác), bạn sẽ thấy nó phụ thuộc vào slf4j.

Đây không phải là tốt đẹp, imho, như logback nên không biết slf4j.

2

Có cách để tìm hiểu.

Dưới đây là ví dụ làm thế nào bạn có thể cấu hình Logback

// Here we create context 
LoggerContext loggerContext = new LoggerContext(); 
// Initializer is used to enrich context with details 
ContextInitializer contextInitializer = new ContextInitializer(loggerContext); 
try { 
    // Get a configuration file from classpath 
    URL configurationUrl = Thread.currentThread().getContextClassLoader().getResource("custom-logback-configuration.xml"); 
    if (configurationUrl == null) { 
     throw new IllegalStateException("Unable to find custom logback configuration file"); 
    } 
    // Ask context initializer to load configuration into context 
    contextInitializer.configureByResource(configurationUrl); 
    // Here we get logger from context 
    logger = loggerContext.getLogger(LogReporter.class); 
} catch (JoranException e) { 
    throw new RuntimeException("Unable to configure logger", e); 
} 

Nói chung nếu bạn muốn biết làm thế nào bất kỳ công trình SLF4J phụ trợ, bạn có thể chỉ nhìn vào nguồn lớp org.slf4j.impl.StaticLoggerBinder từ backend rằng .

+0

Điều này làm việc hoàn hảo cho tôi trong một bối cảnh tương tự mà tôi cần thiết để thiết lập một môi trường Logback 'context' (context) một cách rõ ràng mà không dựa vào liên kết SLF4J (vì SLF4J đã bị ràng buộc với log4j và tôi không có quyền truy cập vào classpath có thể thay đổi nó bằng cách sử dụng các cầu SLF4J khác nhau hoặc tương tự). –

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