log4j: CẢNH BÁO Không tìm thấy trình phụ trợ nào cho trình ghi nhật ký trong web.xml


80

Tôi đã đặt log4jConfigLocation trong web.xml, nhưng tôi vẫn nhận được cảnh báo sau:

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

Tôi đã bỏ lở những gì?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.util.Log4jConfigListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>suara2</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>suara2</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Câu trả lời:


43

Nếu đó là toàn bộ tệp log4j.properties thì có vẻ như bạn chưa bao giờ thực sự tạo một trình ghi nhật ký. Bạn cần một dòng như:

log4j.rootLogger=debug,A1

1
@Kaffiene: có vẻ như bạn đang không đọc toàn bộ câu hỏi (trong trường hợp này, một trong những nhận xét của tác giả cho câu hỏi cung cấp thông tin mà câu trả lời đề cập đến). @CodeGoat: +1 để đọc tất cả các bình luận.
Francisco Alvarado

@FranciscoAlvarado Tôi có log4j.propertiestệp trong đường dẫn lớp, vẫn cảnh báo hiển thị trong bảng điều khiển.
UdayKiran Pulipati

29

Tôi đã đặt log4j.properties ở đúng vị trí trong classpath và vẫn nhận được cảnh báo này với bất kỳ thứ gì sử dụng trực tiếp nó. Mã sử ​​dụng log4j thông qua đăng nhập commons dường như ổn vì một số lý do.

Nếu bạn có:

log4j.rootLogger=WARN

Thay đổi nó thành:

log4j.rootLogger=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n

Theo http://logging.apache.org/log4j/1.2/manual.html :

Trình ghi gốc là ẩn danh nhưng có thể được truy cập bằng phương thức Logger.getRootLogger (). Không có appender mặc định nào được gắn vào root.

Điều này có nghĩa là bạn cần chỉ định một số appender, bất kỳ appender nào, cho root logger để ghi nhật ký diễn ra.

Thêm ứng dụng bảng điều khiển đó vào rootLogger sẽ khiến khiếu nại này biến mất.


1
Tôi có thể dán cái này ở đâu.
UdayKiran Pulipati

@udaykiranpulipati bạn có thể dán cái này vào log4j.properties. Nếu bạn không có log4j.properties, hãy tạo nó trong src / main / resources / nếu sử dụng SBT / Gradle / Maven / etc. Nếu không, hãy đặt nó ở một nơi nào đó mà nó sẽ kết thúc ở gốc của classpath (có thể trong src /).
Alain O'Dea vào

19

Bạn có thể gặp lỗi này khi log4j.propertieskhông có trong classpath.

Điều này có nghĩa là bạn phải di chuyển log4j.propertiesvào thư mục src và đặt đầu ra vào thư mục bin để tại thời điểm chạy, log4j.propertiesnó sẽ đọc từ thư mục bin và lỗi của bạn sẽ được giải quyết dễ dàng.


1
Tôi gặp vấn đề tương tự trong một ứng dụng máy tính để bàn (Applet). Tệp log4j.properties đã có trong thư mục src. Làm cách nào để "đặt đầu ra vào thư mục bin"?
Dilshad Rana

7

Bạn sẽ thấy cảnh báo này nếu log4j không thể tìm thấy tệp "log4j.properties" hoặc "log4j.xml" ở bất kỳ đâu.


2
tôi xác nhận vị trí là chính xác. coz khi tôi đổi tên log4j.properties tên khác, nó cung cấp cho lỗi
cometta

7

Hoặc, bạn có thể làm những gì tôi đã làm và xác định trình ghi nhật ký trước khi tệp cấu hình nhật ký được tải. Điều này sẽ giống như họ nói: "Đặt xe trước con ngựa."

Trong mã:

public static Logger logger = Logger.getLogger("RbReport");

... sau này

PropertyConfigurator.configure(l4j);
logger = Logger.getLogger("RbReport");

Khắc phục là khởi tạo trình ghi nhật ký sau khi cấu hình được tải.

Đối với những người đam mê đó là "Putting Descarte b4 d ngựa".


5

Nếu bạn muốn cấu hình cho các ứng dụng log4j độc lập, bạn có thể sử dụng BasicConfigurator. Giải pháp này sẽ không tốt cho các ứng dụng web như môi trường Spring.

Bạn cần viết-

BasicConfigurator.configure();

hoặc là

ServletContext sc = config.getServletContext();
String log4jLocation = config.getInitParameter("log4j-properties-location");
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
PropertyConfigurator.configure(log4jProp);

4

Nếu vẫn được trợ giúp, hãy xác minh tên của kho lưu trữ, nó phải chính xác là "log4j.properties" hoặc "log4j.xml" (phân biệt chữ hoa chữ thường) và làm theo gợi ý của "Alain O'Dea". Tôi đã gặp phải lỗi tương tự, nhưng sau khi thực hiện những thay đổi này, mọi thứ hoạt động tốt. y như một cái duyên :-). hi vọng điêu nay co ich.


3

Trong trường hợp của tôi, giải pháp rất dễ dàng. Bạn không cần phải khai báo bất cứ điều gì trong của bạn web.xml.

Bởi vì dự án của bạn là một ứng dụng web, tệp cấu hình sẽ được bật WEB-INF/classessau khi triển khai. Tôi khuyên bạn nên tạo một thư mục tài nguyên Java ( src/main/resources) để làm điều đó (thực hiện tốt nhất). Một cách tiếp cận khác là đặt tệp cấu hình vào của bạn src/main/java.

Hãy cẩn thận với tên tệp cấu hình. Nếu bạn đang sử dụng XML, tên tệp là log4j.xml, ngược lại log4j.properties.


2

Đặt những dòng này ở đầu web.xml:

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:/main/resources/log4j.xml</param-value>
</context-param> 

Bạn không cần chỉ định log4jConfigLocation. Nó sẽ lấy từ classpath.
Krishna

bạn đã thêm tệp xml vào bên trong thư mục lớp chưa?
Krishna

log4j của tôi nằm trong src / main / resources / log4j.xml (Tôi đang sử dụng tích hợp mùa xuân và tệp cấu hình của tôi nằm trong src / min / resources / META-INF / spring / integration / spring-integration-context.xml)
MariemJab

thư mục tài nguyên trong classpath?
Krishna

1

OK, tôi thấy rất nhiều câu trả lời và một số câu trả lời rất đúng. Tuy nhiên, không có cách nào khắc phục được sự cố của tôi. Vấn đề trong trường hợp của tôi là quyền của hệ thống tệp UNIX có tệp log4j.properties mà tôi đang chỉnh sửa trên máy chủ do root sở hữu. và chỉ có thể đọc được bởi root. Tuy nhiên, ứng dụng web mà tôi đang triển khai là tomcat không thể đọc tệp vì tomcat chạy như tomcat người dùng trên hệ thống Linux theo mặc định. Hi vọng điêu nay co ich. vì vậy giải pháp là nhập 'chown tomcat: tomcat log4j.properties' trong thư mục chứa tệp log4j.properties.


1

Thêm log4jExposeWebAppRoot -> false trong web.xml của bạn. Nó hoạt động với tôi :)

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>path/log4j.properties</param-value>
</context-param>
<context-param>
    <param-name>log4jExposeWebAppRoot</param-name>
    <param-value>false</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

0

Tôi đã từng gặp vấn đề tương tự . Cài đặt cấu hình giống nhau và thông báo cảnh báo giống nhau. Điều có hiệu quả với tôi là: Thay đổi thứ tự của các mục nhập.

  • Tôi đặt các mục nhập cho cấu hình nhật ký [thông số ngữ cảnh và trình nghe] trên đầu tệp [trước mục nhập cho applicationContext.xml] và nó đã hoạt động.

Tôi đoán là thứ tự quan trọng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.