Cấu hình log4j2 - Không tìm thấy tệp cấu hình log4j2


91

Gần đây, tôi quyết định học cách sử dụng trình ghi log4j2. Tôi đã tải xuống các tệp jar cần thiết, thư viện đã tạo, tệp cấu hình xml và cố gắng sử dụng nó. Rất tiếc, tôi nhận được câu lệnh này trong bảng điều khiển (Eclipse):

ERROR StatusLogger No log4j2 configuration file found. Using default configuration:       logging only errors to the console.

Đây là mã lớp thử nghiệm của tôi:

package log4j.test;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jTest
{
    static final Logger logger = LogManager.getLogger(Logger.class.getName());

    public static void main(String[] args) {    
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.fatal("fatal");
    }
}

Và tệp cấu hình xml của tôi:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test" 
               status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="log4j.test.Log4jTest" level="trace">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Tôi cũng đã thử với xml không có <Logger>thẻ và đặc tả gói và trong các thư mục thư mục / gói khác nhau, nhưng không giúp được gì. Bây giờ log4j2.xmltệp của tôi được đặt trực tiếp trong thư mục dự án trong eclipse.


2
Các doc sais, nó chỉ có được trên classpath. Là nó?
Fildor

vâng, tôi đã bỏ lỡ nó. Xin lỗi vì câu hỏi ngu ngốc và nhờ :)
Qbisiek

Câu trả lời:


139

Đây có phải là một dự án java nhật thực đơn giản mà không có maven, v.v. không? Trong trường hợp đó, bạn sẽ cần phải đặt log4j2.xmltệp trong srcthư mục để có thể tìm thấy nó trên đường dẫn classpath. Nếu bạn sử dụng maven, hãy đặt nó dưới src/main/resourceshoặcsrc/test/resources


4
Người hùng của tôi! Tôi đã có tệp cấu hình trong classpath (tôi nghĩ vậy), nhưng nó không có trong thư mục src. Tôi đã chuyển nó vào đó và nó đang hoạt động!
Shadoninja

cấu hình với một dự án maven như thế nào? (như cách maven, vì tôi cho rằng nếu tôi đặt một 'log4j2.xml' dưới classpath tôi sẽ làm việc), nhờ những lời khuyên :)
Enrique San Martín

log4j2.xml nằm trong src (Dự án JavaFX không có maven) của tôi nhưng nó không được tìm thấy .. điều này có phức tạp không?!?! :(
Ewoks

2
Đối với sbtviệc log4j2.xmlđi vào src/main/resourceslà tốt.
Akavall

tôi không thể tìm thấy tệp này log4j2.xml
Karthiga

32

Bạn cần chọn một trong các giải pháp sau:

  1. Đặt tệp log4j2.xml trong thư mục tài nguyên trong dự án của bạn để log4j sẽ định vị tệp theo đường dẫn lớp.
  2. Sử dụng thuộc tính hệ thống -Dlog4j.configurationFile = file: /path/to/file/log4j2.xml

1
-Dlog4j.configurationFilelà những gì tôi cần, vì dự án tôi đang thực hiện không dựa trên Maven. Tuyệt vời
Kimchi Man

15

Đã làm theo các tài liệu - Apache Log4j2 ConfiguratoinApache Log4j2 Maven trong cấu hình log4j2 với yaml. Theo tài liệu, các phụ thuộc maven sau là bắt buộc:

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.1</version>
  </dependency>

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.8.6</version>
</dependency>

Chỉ thêm những thứ này không chọn được cấu hình và luôn gây ra lỗi. Cách gỡ lỗi cấu hình bằng cách thêm -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACEđã giúp xem nhật ký. Sau đó, phải tải xuống mã nguồn bằng Maven và gỡ lỗi đã giúp hiểu được các lớp phụ thuộc của log4j2. Chúng được liệt kê trong org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory:

com.fasterxml.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode
com.fasterxml.jackson.core.JsonParser
com.fasterxml.jackson.dataformat.yaml.YAMLFactory

Thêm ánh xạ phụ thuộc cho jackson-dataformat-yamlsẽ không có hai lớp đầu tiên. Do đó, hãy thêm phần jackson-databindphụ thuộc để cấu hình yaml hoạt động:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>

Bạn có thể thêm phiên bản bằng cách tham khảo Test Dependenciesphần mục log4j-apiphiên bản từ Kho lưu trữ MVN . Ví dụ: đối với phiên bản 2.8.1 của log4j-api, hãy tham khảo liên kết này và định vị jackson-databindphiên bản.

Hơn nữa, bạn có thể sử dụng mã Java bên dưới để kiểm tra xem các lớp có sẵn trong classpath hay không:

System.out.println(ClassLoader.getSystemResource("log4j2.yml")); //Check if file is available in CP
ClassLoader cl = Thread.currentThread().getContextClassLoader(); //Code as in log4j2 API. Version: 2.8.1
 String [] classes = {"com.fasterxml.jackson.databind.ObjectMapper",
 "com.fasterxml.jackson.databind.JsonNode",
 "com.fasterxml.jackson.core.JsonParser",
 "com.fasterxml.jackson.dataformat.yaml.YAMLFactory"};

 for(String className : classes) {
     cl.loadClass(className);
 }


3

Eclipse sẽ không bao giờ nhìn thấy một tệp cho đến khi bạn buộc làm mới IDE. Một tính năng của nó! Vì vậy, bạn có thể đặt tệp trên toàn bộ dự án và Eclipse sẽ bỏ qua nó hoàn toàn và ném những lỗi này. Nhấn refresh trong dạng xem dự án Eclipse và sau đó nó hoạt động.


0

Trong trường hợp của tôi, tôi đã phải đặt nó vào thư mục bin của dự án của mình ngay cả khi thực tế là classpath của tôi được đặt thành thư mục src. Tôi không biết tại sao, nhưng nó đáng để thử.


Điều này cho thấy rằng dự án không nhận ra rằng thư mục chứa cấu hình của bạn là một thư mục tài nguyên, vì vậy nó không tự động sao chép tệp như một phần của bản dựng. Tôi khuyên bạn nên xem xét vấn đề này thêm vì cuối cùng bạn sẽ thực hiện thay đổi đối với nguồn sẽ không bị sao chép vào thư mục bin và cuối cùng sẽ dành nhiều thời gian để tự hỏi tại sao thay đổi của bạn không hoạt động.
Sarah Phillips
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.