2010-01-21 32 views
15

khi triển khai ứng dụng/Hibernate mùa xuân của tôi, tôi nhận được những cảnh báo sau đây liên quan đến khai thác gỗ:bối rối bởi Systems Logging Java với Spring và Hibernate

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). 
log4j:WARN Please initialize the log4j system properly. 

ngạc nhiên đối với tôi là thiếu thông tin từ Google/SO tìm kiếm . Điều duy nhất có liên quan là bài đăng SO này Problem with Commons Logging/Log4j setup in spring webapp with tomcat 6

Tuy nhiên, điều này thậm chí còn vượt xa tôi. Ai đó có thể làm rõ các hệ thống ghi nhật ký khi chơi ở đây hay chỉ cho tôi một tài nguyên RECENT về vấn đề này (có một số kết quả tìm kiếm google cổ đại không thực sự áp dụng). Cụ thể, các vấn đề tôi đang vật lộn với:

  • Sự khác biệt giữa ghi nhật ký, log4j, slf4j và JCL. Sự hiểu biết của tôi là slf4j là một trình bao bọc, trong khi commons-logging và log4j là các triển khai thực tế. Tôi không biết JCL khớp ở đâu.

  • Cách định cấu hình ghi nhật ký cho Spring. Có gì trong tệp web.xml, tôi có cần tệp log4j.properties hoặc tệp log4j.xml không? Nó đi đâu, trong WEB-INF? Có bất cứ điều gì đi trong tập tin applicationContext.xml của tôi? (xin lỗi nhưng tôi cần phải bắt đầu từ số không ở đây).

  • Tôi đang sử dụng Hibernate trong dự án của mình và bao gồm qua Maven. Có vẻ như Hibernate sử dụng slf4j-đơn giản. Tôi đã thấy cảnh báo nói rằng tôi không thể có slf4j-đơn giản và slf4j-log4j cả trên classpath. Tôi đã không bao gồm slf4j-log4j như là một phụ thuộc, nhưng Hibernate phải được bao gồm nó. Làm thế nào để tôi giải quyết vấn đề này? Tôi có thể buộc Hibernate sử dụng log4j thay thế không?

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn.


chỉnh sửa:

Cảm ơn tất cả các câu trả lời cho đến nay. Tôi đưa ra những gợi ý này. Còn ứng dụng web mùa xuân cụ thể thì sao? Tôi đã nhìn thấy các ví dụ về người nghe và các tham số và không được đưa vào tệp web.xml. Điều này cũng được yêu cầu?

Trả lời

12
  • commons-loggingSLF4J đều Trình bao bọc API xung quanh các triển khai ghi nhật ký khác. SLF4J là hiện đại hơn của hai, và thay vì có khả năng hơn. Log4j là triển khai ghi nhật ký và tiêu chuẩn defacto khá nhiều. JUL (viết tắt là java.util.logging) là triển khai ghi nhật ký (thường là khủng khiếp) đi kèm với JRE. Một triển khai nhật ký khác là logback, vốn đang dần thu hút lực kéo, nhưng chưa được phổ biến rộng rãi.
  • log4j.propertieslog4j.xml là các cách khác nhau để định cấu hình log4j, cả hai đều có giá trị như nhau. Mà một trong những bạn sử dụng là tùy thuộc vào bạn, mặc dù một số máy chủ ứng dụng dictate một hay khác. Đọc số log4j manual để tìm hiểu cách định cấu hình này.
  • Nếu Hibernate sử dụng SLF4J làm API của nó, đó là sự lựa chọn của các nhà phát triển Hibernate. Tuy nhiên, bạn có thể chọn thực thi ghi nhật ký mà SLF4J sẽ ủy quyền. Một lần nữa, hãy đọc số slf4j manual để tìm hiểu cách chọn triển khai đã chọn của bạn.

Có, tất cả đều khá khó hiểu. Với một lựa chọn mở, SLF4J và Logback là sự kết hợp có khả năng nhất, nhưng bạn thường không nhận được một lựa chọn mở. Các khung công tác khác nhau (như Hibernate và Spring) sẽ có khả năng sử dụng các API ghi nhật ký khác nhau, thường là ghi nhật ký hoặc SLF4J, nhưng bạn có thể nhận được tất cả các API đó để cuối cùng đăng nhập vào cùng một triển khai cơ bản (thường là log4j).

+0

skaffman câu trả lời xuất sắc – underdog

2

Bạn cần tệp log4j.properties trong đường dẫn lớp của mình. Dưới đây là một đặc tính tối thiểu nộp tôi tình cờ đã tạo ra ngày hôm qua:

log4j.logger.BillReview=INFO,BillReviewLog 
log4j.appender.BillReviewLog=org.apache.log4j.RollingFileAppender 
log4j.appender.BillReviewLog.File=BillReview.log 
log4j.appender.BillReviewLog.Append=true 
log4j.appender.BillReviewLog.MaxFileSize=5000KB 
log4j.appender.BillReviewLog.MaxBackupIndex=5 
log4j.appender.BillReviewLog.layout=org.apache.log4j.PatternLayout 
log4j.appender.BillReviewLog.layout.ConversionPattern=%c %p %-10.10X{server} %-4.4X{user} %d{ISO8601} %m%n 

Đặt rằng vào một tập tin log4j.properties, thay đổi tất cả các tài liệu tham khảo để 'BillReview' một cái gì đó giống như dự án của bạn và điều đó sẽ đăng nhập vào một và dừng các tin nhắn đó.

Câu hỏi của bạn về khung đăng nhập nào phần lớn là lựa chọn cá nhân. Log4j là chuẩn cũ và nó hoạt động tốt, Commons logging và slf4j là các API mới hơn và cho phép một số trường hợp sử dụng phức tạp hơn.

1

Tôi sẽ cho một số Gurus có kinh nghiệm hơn tôi trả lời viên đạn đầu tiên.

Answering đạn thứ hai của bạn ...

Bạn có thể sử dụng một log4j.properties hoặc log4j.xml file (nó không quan trọng mà). Bất cứ điều gì bạn chọn bạn nên thêm nó vào classpath của bạn (thường nó nên đi trong cùng một thư mục như mã nguồn của bạn). Nếu bạn đang sử dụng Spring, một cách hay để chia thư mục src của bạn thành các phần logic là sử dụng cấu trúc thư mục sau đây .../ Main/java

src - đưa nguồn chính ở đây
src/main/nguồn lực - nguồn lực đưa được sử dụng bởi bạn nguồn chính ở đây
src/kiểm tra/java - đưa nguồn kiểm tra ở đây (đối với các bài kiểm tra)
src/test/resources - đặt tài nguyên để thử nghiệm tại đây

Do đó, bạn sẽ đặt log4j.properties vào thư mục src/test/resources.

Answering đạn thứ ba của bạn ...

Bạn có thể loại trừ một sự phụ thuộc trong một sự phụ thuộc vào bạn pom.xml tập tin bằng cách làm như sau ...

<dependency> 
    <groupId>org.apache.xbean</groupId> 
    <artifactId>xbean-spring</artifactId> 
    <version>${xbean.version}</version> 
    <exclusions> 
     <exclusion> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 
4
  • Sự khác biệt giữa ghi nhật ký, log4j, slf4j và JCL. Sự hiểu biết của tôi là slf4j là một trình bao bọc, trong khi commons-logging và log4j là các triển khai thực tế. Tôi không biết nơi JCL phù hợp.

Jakarta Commons Logging (JCL) và Logging mặt tiền đơn giản cho Java SLF4J đều trừu tượng cho nhiều khuôn khổ khai thác gỗ ví dụ java.util.logging, log4j và logback, cho phép người dùng cuối cắm vào khung khai thác mong muốn tại thời điểm triển khai. Commons Logging được biết là bị các vấn đề về trình nạp lớp, đó là những gì SLF4J cố gắng giải quyết (SLF4J được biết đến là một thư viện rõ ràng hơn). Có nói rằng, thực tế là mùa xuân sử dụng Jakarta Commons Logging API (xem Logging Dependencies in Spring): Spring được biên dịch với JCL và Spring làm cho các đối tượng JCL Log có sẵn cho các lớp mở rộng Spring. Thực tế là chỉ bắt buộc phụ thuộc bên ngoài vào Mùa xuân.Lựa chọn này has been made vì nhiều khung công tác khác cũng sử dụng nó (ví dụ: Struts). Ý tưởng là để tránh phải có nhiều thư viện mặt tiền trên đường dẫn lớp khi xây dựng các ứng dụng ("A" cho Spring, "B" cho Struts, vv). Tuy nhiên, đó là có thể để thay thế JCL bằng SLF4J nếu bạn muốn (SFL4J cung cấp các ràng buộc cho khung công tác ghi nhật ký nhưng cũng là cầu nối "JCL đến SLF4J"). Xem bài đăng được đề cập Logging Dependencies in Spring để biết tất cả chi tiết.

  • Cách định cấu hình ghi nhật ký cho Spring. Có gì trong tệp web.xml, tôi có cần tệp log4j.properties hoặc tệp log4j.xml không? Nó đi đâu, trong WEB-INF? Có bất cứ điều gì đi trong tập tin applicationContext.xml của tôi? (xin lỗi nhưng tôi cần phải bắt đầu từ số không ở đây).

Để đăng nhập, bạn có 1. để quyết định thi hành bạn muốn sử dụng (java.util.logging, log4j hay logback), 2. để đặt chọn một trên classpath nếu có yêu cầu (java. util.logging là trong Java SE vì vậy nó không yêu cầu thêm thư viện) và 3. để cấu hình nó (bằng cách đặt một tập tin cấu hình trên classpath). Nếu bạn chọn sử dụng log4j, chỉ cần thêm jar của nó và một số log4j.properties hoặc một số ưa thích (nhưng tiết hơn) log4j.xml (đây chỉ là một định dạng khác cho cấu hình) cho đường dẫn lớp.

  • Tôi đang sử dụng Hibernate trong dự án của mình và bao gồm qua Maven. Có vẻ như Hibernate sử dụng slf4j-đơn giản. Tôi đã thấy cảnh báo nói rằng tôi không thể có slf4j-đơn giản và slf4j-log4j cả trên classpath. Tôi đã không bao gồm slf4j-log4j như là một phụ thuộc, nhưng Hibernate phải được bao gồm nó. Làm thế nào để tôi giải quyết vấn đề này? Tôi có thể buộc Hibernate sử dụng log4j thay thế không?

Hibernate utilizes Simple Logging Facade for Java (SLF4J) và, quả thật vậy, bạn không thể có một vài bindings (ví dụ slf4j-simple.jarslf4j-logj12.jar) trên classpath cùng một lúc. Ở đây, bạn rất có khả năng nhận được slf4j-simple.jar quá mức từ một phụ thuộc khác. Để giải quyết vấn đề này, hãy chạy mvn dependency:tree để tìm hiểu xem nó đến từ đâu và loại trừ nó nếu cần.

Và bằng cách này, trong trường hợp của bạn, tôi sẽ cấu hình Spring để sử dụng SLF4J khi Hibernate đang sử dụng nó. Làm theo các bước trong liên kết được đề cập trong đoạn đầu tiên cho điều đó. Và tôi sẽ sử dụng logback như khung đăng nhập (mà người kế nhiệm của log4j), đây là nơi mọi thứ xảy ra ngay bây giờ.

0

Tôi gặp sự cố trong cùng một khu vực trong khi chạy thử nghiệm của mình. Cuối cùng tôi nhận thấy rằng junit đã mang lại số slf4j-nop làm phụ thuộc, ngoài số slf4j-log4j12 mà tôi muốn. Khi tôi loại trừ slf4j-nop, nó đã bắt đầu hoạt động.

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