2011-12-29 5 views
18

Từ những gì tôi đã thấy trong các tệp pom.xml mùa xuân là chúng thêm một vài mục cho slf4j và log4j và bằng cách nào đó khi bạn sử dụng log4j trong ứng dụng mùa xuân của bạn, nó sẽ được bao bọc bởi thư viện slf4j.Làm thế nào để thêm slf4j vào gói log4j pom.xml?

Ai đó có thể giải thích cho tôi điều này kỳ diệu xảy ra như thế nào?

Trả lời

4

slf4j là API ghi nhật ký, không làm gì cả, chỉ là một loạt giao diện. log4j là một hệ thống đăng nhập, với các lớp bê tông. có một thư viện slf4j-log4j sử dụng log4j làm phụ trợ cho API slf4j.

Một số dự án rõ ràng phụ thuộc vào log4j, chúng gọi là các lớp cụ thể. Vì vậy, bạn không thể sử dụng một chương trình phụ trợ khác (ví dụ: logback hoặc j.u.l hoặc apache commons hoặc bất kỳ thứ gì) cho dự án của bạn mà bạn đã thực hiện một cách khôn ngoan bằng cách sử dụng API slf4j.

a trick để thay thế các lớp log4j bằng cách thực hiện mô hình (cây cầu) chỉ đơn giản là chuyển hướng tất cả các cuộc gọi đến sl4j. Trong maven bạn chỉ cần khai báo một phụ thuộc với số phiên bản rất cao và giả lập này được coi là thư viện log4j cực kỳ hiện đại.

+0

vì vậy khi chạy nó sử dụng tiêm phụ thuộc? vẫn còn bối rối xin lỗi. – codecompleting

+0

Không, con quạ ''. Có lẽ tôi không hiểu câu hỏi? Bạn có thể làm rõ nó? – kan

27

Spring vẫn sử dụng commons-logging cho tất cả ghi nhật ký nội bộ (tương thích ngược). Nếu bạn muốn sử dụng một số khung đăng nhập khác (log4j) thì bạn cần phải gọi số cầu các cuộc gọi từ commons logging đến khung lựa chọn của bạn. Nếu không, bạn sẽ phải duy trì nhiều cấu hình ghi nhật ký.

slf4j hoạt động như một mặt tiền đơn giản cho các khuôn khổ khác nhau khai thác gỗ (jul, log4j, jcl, logback) và cho phép bạn cắm vào khung đăng nhập mong muốn vào thời điểm triển khai.

Thay vì sử dụng triển khai khung đăng nhập được áp đặt bởi khung bên thứ ba, bạn cung cấp triển khai cầu slf4j's hoạt động như thực tế nhưng thực sự chỉ chuyển tiếp cuộc gọi đăng nhập tới slf4j hoặc ràng buộc cụ thể.

phần Đốn và cung cấp Maven pom.xml thường trông như thế này:

<!-- remove the real commons-logging from classpath --> 
<!-- declare as provided or exclude from spring jars --> 
<dependency> 
    <artifactId>commons-logging</artifactId> 
    <groupId>commons-logging</groupId> 
    <version>1.0</version> 
    <scope>provided</scope> 
</dependency> 

<!-- add slf4j interfaces to classpath --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.6.4</version> 
    <scope>compile</scope> 
</dependency> 

<!-- add commons logging to slf4j bridge to classpath --> 
<!-- acts as jcl but routes commons-logging calls to slf4j --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
    <version>1.6.4</version> 
    <scope>runtime</scope> 
</dependency> 

<!-- add log4j binding to classpath --> 
<!-- routes slf4j calls to log4j --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.6.4</version> 
    <scope>runtime</scope> 
</dependency> 

<!-- add log4j to classpath --> 
<!-- does the logging --> 
<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.16</version> 
</dependency> 

này không có gì để làm với container mùa xuân cũng không dependency injection, nó là classpath tinh khiết, classloader thứ ...

Vui lòng xem các liên kết thefollowing để biết thêm chi tiết.

+0

Trong khi câu trả lời này khá tốt, có một điểm không chính xác trong đó: SLF4J không * bắc cầu * qua ghi nhật ký commons, phụ thuộc 'jcl-over-slf4j' * chứa một reimplementation API đăng nhập commons *. Đây là lý do tại sao nó là quan trọng để đảm bảo rằng commons đăng nhập không phải là trên classpath của bạn, bởi vì hai mô-đun sử dụng cùng một tên gói (như là một điều cần thiết) và do đó xung đột với mỗi thảm họa. Mô-đun "ngữ cảnh" của Spring chứa phụ thuộc vào "spring-core" chứa phụ thuộc vào "commons-logging", đó là lý do tại sao bạn phải thực hiện các biện pháp tích cực để ngăn chặn điều này khi sử dụng Spring –

+0

. phụ thuộc vào việc ghi nhật ký trong Spring, mà bạn có thể thực hiện như được mô tả trong [bài viết này trên trang web của Spring] (https: // spring.io/blog/2009/12/04/logging-dependencies-in-spring), thay vì nói với Maven rằng bạn đã có nó trên classpath của bạn (đó là một chút của một hack, thực sự). –