การกำหนดค่า Log4j2 - ไม่พบไฟล์คอนฟิกูเรชัน log4j2


91

เมื่อเร็ว ๆ นี้ฉันตัดสินใจเรียนรู้วิธีใช้คนตัดไม้ log4j2 ฉันดาวน์โหลดไฟล์ jar ที่ต้องการสร้างไลบรารีไฟล์ comfiguration xml และพยายามใช้งาน น่าเสียดายที่ฉันได้รับคำสั่งนี้ในคอนโซล (Eclipse):

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

นี่คือรหัสชั้นเรียนการทดสอบของฉัน:

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");
    }
}

และไฟล์กำหนดค่า xml ของฉัน:

<?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>

ฉันลองใช้ xml ที่ไม่มี<Logger>แท็กและข้อกำหนดแพ็คเกจและในโฟลเดอร์ / ไดเรกทอรีแพ็คเกจต่างๆ แต่ก็ไม่ได้ช่วยอะไร ตอนนี้log4j2.xmlไฟล์ของฉันอยู่ในโฟลเดอร์โครงการโดยตรงใน eclipse


2
doc sais มันก็จะต้องมีในคลาสพา ธ ใช่ไหม?
Fildor

ใช่ฉันพลาดไปแล้ว ขออภัยสำหรับคำถามโง่ ๆ และขอบคุณ :)
Qbisiek

คำตอบ:


139

นี่เป็นโปรเจ็กต์ eclipse java แบบธรรมดาที่ไม่มี maven ฯลฯ หรือไม่? ในกรณีนี้คุณจะต้องวางlog4j2.xmlไฟล์srcไว้ในโฟลเดอร์เพื่อให้สามารถค้นหาได้ใน classpath ถ้าคุณใช้ maven วางไว้ข้างใต้src/main/resourcesหรือsrc/test/resources


4
ผู้กล้าของฉัน! ฉันมีไฟล์คอนฟิกูเรชันใน classpath (ฉันคิดว่า) แต่มันไม่ได้อยู่ในโฟลเดอร์ src ฉันย้ายไปที่นั่นแล้วและตอนนี้ใช้งานได้แล้ว!
Shadoninja

Configurate กับโครงการ maven อย่างไร? (เหมือนวิธี maven เพราะฉันคิดว่าถ้าฉันใส่ 'log4j2.xml' ไว้ใต้ classpath ฉันจะใช้งานได้) ขอบคุณสำหรับคำแนะนำ :)
Enrique San Martín

log4j2.xml อยู่ใน src ของฉัน (JavaFX Project ที่ไม่มี maven) แต่ไม่พบ .. มันซับซ้อนขนาดนี้เลยเหรอ!?! :(
Ewoks

2
สำหรับsbtการlog4j2.xmlเข้าไปsrc/main/resourcesเช่นกัน
Akavall

ฉันไม่พบไฟล์นี้ log4j2.xml
Karthiga

32

คุณต้องเลือกหนึ่งในวิธีแก้ไขปัญหาต่อไปนี้:

  1. ใส่ไฟล์ log4j2.xml ในไดเร็กทอรีรีซอร์สในโปรเจ็กต์ของคุณดังนั้น log4j จะค้นหาไฟล์ภายใต้คลาสพา ธ
  2. ใช้คุณสมบัติระบบ -Dlog4j.configurationFile = file: /path/to/file/log4j2.xml

1
-Dlog4j.configurationFileคือสิ่งที่ฉันต้องการเนื่องจากโปรเจ็กต์ที่ฉันกำลังทำนั้นไม่ได้มีพื้นฐานมาจาก Maven Awesome
Kimchi Man

15

กำลังติดตามเอกสาร - Apache Log4j2 ConfiguratoinและApache Log4j2 Mavenในการกำหนดค่า log4j2 ด้วย yaml ตามเอกสารประกอบจำเป็นต้องมีการอ้างอิง maven ต่อไปนี้:

  <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>

เพียงแค่เพิ่มสิ่งเหล่านี้ไม่ได้เลือกการกำหนดค่าและให้ข้อผิดพลาดเสมอไป วิธีการดีบักคอนฟิกูเรชันโดยการเพิ่มความ-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACEช่วยเหลือในการดูบันทึก ต่อมาต้องดาวน์โหลดซอร์สโดยใช้ Maven และการดีบักช่วยในการทำความเข้าใจคลาสที่ขึ้นอยู่กับ log4j2 มีรายชื่ออยู่ใน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

การเพิ่มการแม็ปการอ้างอิงสำหรับjackson-dataformat-yamlจะไม่มีสองคลาสแรก ดังนั้นเพิ่มการjackson-databindพึ่งพาเพื่อให้การกำหนดค่า yaml ทำงาน:

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

คุณอาจเพิ่มรุ่นโดยหมายถึงTest Dependenciesส่วนของlog4j-apiรายการจากรุ่นMVN Repository เช่นสำหรับ log4j-api เวอร์ชัน 2.8.1 โปรดดูลิงก์นี้และค้นหาjackson-databindเวอร์ชัน

ยิ่งไปกว่านั้นคุณสามารถใช้โค้ด Java ด้านล่างเพื่อตรวจสอบว่ามีคลาสใน classpath หรือไม่:

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);
 }

4

นอกจากนี้สิ่งที่ Tomasz W เขียนเมื่อเริ่มแอปพลิเคชันของคุณคุณสามารถใช้การตั้งค่า:

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE 

เพื่อแก้ไขปัญหาการกำหนดค่าส่วนใหญ่

สำหรับรายละเอียดโปรดดูคำถามที่พบบ่อยของ Log4j2: ฉันจะดีบักการกำหนดค่าของฉันได้อย่างไร?


3

Eclipse จะไม่เห็นไฟล์จนกว่าคุณจะบังคับรีเฟรช IDE คุณสมบัติของมัน! ดังนั้นคุณสามารถวางไฟล์ไว้ทั่วโปรเจ็กต์และ Eclipse จะเพิกเฉยต่อไฟล์ทั้งหมดและโยนข้อผิดพลาดเหล่านี้ กดรีเฟรชในมุมมองโปรเจ็กต์ Eclipse จากนั้นทำงาน


0

ในกรณีของฉันฉันต้องวางไว้ในโฟลเดอร์ bin ของโครงการของฉันแม้ว่า classpath ของฉันจะถูกตั้งค่าเป็นโฟลเดอร์ src ก็ตาม ฉันไม่รู้ว่าทำไม แต่ก็คุ้มที่จะลอง


สิ่งนี้แสดงให้เห็นว่าโครงการไม่รู้จักว่าโฟลเดอร์ที่มีการกำหนดค่าของคุณเป็นโฟลเดอร์ทรัพยากรดังนั้นจึงไม่คัดลอกไฟล์โดยอัตโนมัติเป็นส่วนหนึ่งของบิลด์ ฉันขอแนะนำให้ตรวจสอบสิ่งนี้เพิ่มเติมเพราะในที่สุดคุณจะทำการเปลี่ยนแปลงแหล่งที่มาที่จะไม่ถูกคัดลอกไปยังโฟลเดอร์ bin และต้องใช้เวลานานหลายปีที่สงสัยว่าทำไมการเปลี่ยนแปลงของคุณไม่ได้ผล
Sarah Phillips
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.