2008-10-20 31 views
15

Tôi đã là một vấn đề wih một thiết lập đăng nhập vào một webapp apring triển khai dưới tomcat 6.Vấn đề với Commons Logging/Log4j thiết lập trong webapp mùa xuân với tomcat 6

Các webapp sử dụng api commons-logging, trên log4j runtime nên được dùng. Tệp nhật ký được tạo nhưng vẫn trống - không có mục nhập nhật ký nào xảy ra.

thiết lập như sau:

WEB-INF/web.xml:

<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>/WEB-INF/log4j.xml</param-value> 
    </context-param> 
    <listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 

WEB-INF/classes/commons-logging.properties:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger 

WEB- INF/log4j.xml:

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    ... 
    </appender> 
    <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> 
    <param name="File" value="${catalina.home}/logs/my.log"/> 
    ... 
    </appender> 

    <logger name="my.package"> 
    <level value="INFO"/> 
    </logger> 

    <root> 
    <level value="ERROR"/> 
    <appender-ref ref="CONSOLE"/> 
    <appender-ref ref="FILE"/> 
    </root> 
</log4j:configuration> 

Nhật ký tệp/my.log được tạo nhưng không có nhật ký nào xuất hiện. Các bản ghi thông tin trên giao diện điều khiển tomcat, nhưng không phải với mẫu bố cục được cấu hình.

Tính năng commons-logging-1.1.1.jar và log4j-1.2.14.jar được bao gồm trong WEB-INF/lib. Bất kỳ ý tưởng gì là sai ở đây?

Trả lời

10

Có nhiều trường hợp được ghi lại trên web cảnh báo mọi người về việc sử dụng tính năng ghi nhật ký. Vì vậy, nhiều như vậy, rằng SLF4J là đạt được rất nhiều phổ biến.

Xét rằng bạn không quan tâm đến việc sử dụng Tomcat với Log4j, bạn chỉ nên sử dụng Log4j trực tiếp trong ứng dụng của mình. Đặc biệt nếu không có cơ hội bạn sẽ chuyển đổi khung công tác ghi nhật ký trong tương lai. Nó sẽ làm giảm sự phức tạp của ứng dụng của bạn và loại bỏ bất kỳ vấn đề trình tải lớp nào mà bạn đang gặp phải với việc ghi nhật ký.

Đây phải là một tìm kiếm tương đối dễ dàng và thay thế trong văn bản của bạn, vì ghi nhật ký và log4j đều sử dụng cấu trúc cuộc gọi tương tự cho phương thức ghi nhật ký của chúng.

+1

Tôi nghĩ rằng commons-logging (kể từ 1.1, ở đó các lỗi dẫn đến rò rỉ bộ nhớ trước) là ok. Nhưng có lẽ nó là giải pháp tốt nhất chỉ để sử dụng log4j trực tiếp - để lại các thư viện bằng cách sử dụng commons-logging unlogged. –

+0

Điều này tất cả làm việc trong Tomcat 5.5 - đôi khi mọi thứ trở nên tồi tệ hơn –

+1

Không, commons-logging vẫn là rác (2010), sử dụng slf4j. http://articles.qos.ch/thinkAgain.html – Manius

1

Bạn cần biên dịch thành phần bổ sung để ghi nhật ký đầy đủ. Theo mặc định, Tomcat 6 sử dụng một triển khai hardcoded của commons-logging luôn luôn ủy nhiệm cho java.util.logging.

hướng dẫn xây dựng ở đây http://tomcat.apache.org/tomcat-6.0-doc/building.html

Sau đó thay thế tomcat-juli.jar trong thư mục/bin của Tomcat và đặt tomcat-juli-adapters.jar trong thư mục/lib cùng với log4j và config.

+0

Tôi không wont tomcat bản thân để đăng nhập với log4j, chỉ cần tôi ứng dụng web. Hoặc là có một lỗi classloader tomcat không cho phép cung cấp đăng nhập commons của riêng tôi? –

+0

Nếu Tomcat có các lớp Ghi nhật ký Commons trong đường dẫn lib của nó, thì nó sẽ được nạp trước khi bất kỳ JAR nào trong WEB-INF/lib được nạp. –

+0

Vấn đề là thiết kế bộ nạp lớp trong tomcat 6 (Thường không nên có Hệ thống làm cha mẹ). –

5

Hãy đặc biệt cẩn thận khi bạn có không đặt log4j.jar trong thư mục commons/lib Tomcat. Nếu trình nạp lớp gốc tải các thư viện log4j, bạn sẽ gặp phải các xung đột và các vấn đề khởi tạo khi các ứng dụng web của bạn cũng cố gắng sử dụng log4j.

Nếu bạn cần sử dụng log4j để ghi nhật ký Tomcat thông thường, bạn cần phải cẩn thận rằng các ứng dụng web của bạn cũng không cố tải log4j. Nếu bạn có nhiều webapps trên máy chủ, thì bạn sẽ cần kỷ luật rằng mỗi lần khởi tạo nhật ký webapp không bị dẫm lên khi khởi tạo các ứng dụng web khác. Mỗi ứng dụng web sẽ cần phải sử dụng ID trình ghi nhật ký duy nhất, có thể được thực hiện bằng các tên gói duy nhất.

Sử dụng log4j phổ biến trong Tomcat với nhiều ứng dụng web gây ra xung đột nghiêm trọng khi bạn đã chia sẻ các thư viện mà tất cả đều muốn ghi nhật ký, chẳng hạn như Hibernate hoặc Spring. Các ứng dụng web tiếp theo mà cố gắng để khởi tạo log4j có thể đóng logger của trước đó.Nó có thể là một mớ hỗn độn.

-1

Có thể tôi đã sai. Hãy thử như sau:

A) Thêm appender để my.package như: HOẶC B) Giảm leve nhật ký của gốc để INFO

+0

Nó không phải là dễ dàng, tôi biết để cấu hình log4j. –

0

nếu bạn đang sử dụng log4j + phổ biến đăng nhập, bạn có thể tránh hầu hết các cấu hình trên. nhật ký phổ biến LogFactory có một tính năng khám phá tương tự như JAXP, trong ưu tiên sau đây, tìm kiếm các cài đặt Nhật ký, 1. thuộc tính cấu hình org.apache.commons.logging.Log bên trong tệp commons-logging.properties 2. thuộc tính hệ thống org.apache. commons.logging.Log 3. Nếu Log4J có sẵn ở đường dẫn lớp, hãy sử dụng lớp trình bao bọc tương ứng (Log4JLogger). 4. Jdk14Logger 5. SimpleLog

chỉ cần đảm bảo, cả common-logging.jar và common-logging-api.jar và log4j.jar ở classpath.

3

Tôi đã gặp sự cố tương tự và đã tìm thấy bản sửa lỗi ngay bây giờ. Bắt đầu tomcat với tham số bổ sung:

-Dorg.apache.commons.logging.LogFactory = org.apache.commons.logging.impl.LogFactoryImpl

+0

Làm việc cho tôi !! Cảm ơn bạn ! Bị kẹt trong vòng 1 tuần: P –

+0

Đã chiến đấu trong nhiều ngày - cảm ơn bạn! – Marplesoft

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