ฉันควรวางไฟล์ log4j.properties ไว้ที่ไหน


137

ฉันเขียนโครงการบริการเว็บโดยใช้ netbeans 6.7.1 กับ glassfish v2.1 ใส่ log4j.properties ไปยัง root dir ของโครงการและใช้:

static Logger logger = Logger.getLogger(MyClass.class);

ในตัวสร้าง:

PropertyConfigurator.configure("log4j.properties");

และในฟังก์ชั่น:

logger.info("...");
logger.error("...");
// ...

แต่เป็นข้อมูลข้อผิดพลาด (อันที่จริงฉันพยายามใส่ไว้เกือบทุก dir ที่ฉันรู้):

log4j:ERROR Could not read configuration file [log4j.properties].
java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:297)
        at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:315)
        at com.corp.ors.demo.OrsDemo.main(OrisDemo.java:228)
log4j:ERROR Ignoring configuration file [log4j.properties].
log4j:WARN No appenders could be found for logger (com.corp.ors.demo.OrsDemo).
log4j:WARN Please initialize the log4j system properly.

ตัวอย่างโครงการสามารถหาได้จากhttp://www.91files.com/?N3F0QGQPWMDGPBRN0QA8


2
จุดประสงค์ของ PropertyConfigurator.configure ("log4j.properties") คืออะไร ไลน์ ? ฉันไม่เคยใช้อันนี้ ไฟล์ log4j.xml ของคุณต้องอยู่ "ที่ไหนสักแห่ง" ใน classpath ของคุณเท่านั้น
Antoine Claval

1
ดูที่stackoverflow.com/questions/1140358/…เพื่อค้นหาว่ามีการบันทึกการกำหนดค่า log4j อย่างไร ฉันคิดว่าสิ่งนี้จะช่วยคุณได้มากเพราะบางคอนเทนเนอร์มีการกำหนดค่า log4j ของตัวเอง
dz.

@AntoineClaval ฉันลบบรรทัดที่สาปแช่งออกไปและมันก็ใช้งานได้เหมือนมีเสน่ห์ ผู้ชายขี่อะไร ..
Siddharth

คำตอบ:


115

ฉันรู้ว่ามันสายไปหน่อยที่จะตอบคำถามนี้และบางทีคุณอาจพบวิธีแก้ปัญหาแล้ว แต่ฉันกำลังโพสต์วิธีแก้ปัญหาที่ฉันพบ (หลังจากที่ฉัน googled มาก) ดังนั้นมันอาจช่วยได้เล็กน้อย:

  1. ใส่ log4j.properties ภายใต้ WEB-INF \ คลาสของโปรเจ็กต์ตามที่กล่าวไว้ก่อนหน้านี้ในเธรดนี้
  2. ใส่ log4j-xx.jar ภายใต้ WEB-INF \ lib
  3. ทดสอบว่าโหลด log4j หรือไม่: เพิ่ม-Dlog4j.debug@ ท้ายตัวเลือก java ของ tomcat

หวังว่านี่จะช่วยได้

rgds


ใช้คำสั่ง 'run' เพื่อรับ tomcat ในเบื้องหน้า คุณสามารถส่งผ่านตัวเลือก java ผ่านทางบรรทัดคำสั่ง นอกจากนี้ตัวเลือก -x ในการทุบตียังมีประโยชน์ในการดูว่าเกิดอะไรขึ้นกับตัวเลือกของคุณ: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM

51

ตามที่ระบุไว้แล้ว log4j.properties ควรอยู่ในไดเร็กทอรีที่รวมอยู่ใน classpath ฉันต้องการเพิ่มว่าในโครงการ mavenized สถานที่ที่ดีสามารถ src/main/resources/log4j.properties


26

คุณต้องวางไว้ในไดเร็กทอรีรูทที่สอดคล้องกับบริบทการดำเนินการของคุณ

ตัวอย่าง:

    MyProject
       src
           MyClass.java
           log4j.properties

หากคุณเริ่มดำเนินการจากโปรเจ็กต์อื่นคุณจะต้องมีไฟล์นั้นในโปรเจ็กต์ที่ใช้เพื่อเริ่มการดำเนินการ ตัวอย่างเช่นหากโปรเจ็กต์อื่นมีการทดสอบ JUnit บางอย่างโปรเจ็กต์จำเป็นต้องมีไฟล์ log4j.properties ด้วย


ฉันขอแนะนำให้ใช้ log4j.xml แทน log4j.properties คุณมีทางเลือกมากขึ้นรับความช่วยเหลือจาก IDE ของคุณและอื่น ๆ ...


ตัวอย่างเช่นฉันแทบจะใส่ทุกไดเรกทอรี แต่ไม่เป็นประโยชน์กับโครงการปรับใช้ Glassfish เนื่องจาก GF ไม่คัดลอกคุณสมบัติไปยังไดเร็กทอรีที่ถูกต้อง ดูเหมือนว่า GF จะสูญเสียมันไป
โมโน

จริงๆแล้วฉันคิดว่าปัญหามาจากการปรับใช้ netbeans โดยอัตโนมัติ ฉันพยายามปรับใช้โดยไฟล์ war ในคอนโซลผู้ดูแลระบบก็ใช้ได้ ไม่รู้ว่าคิดถูกรึเปล่า ถ้าฉันพูดถูกทำไม netbeans ไม่ปรับใช้ไฟล์เหล่านี้เมื่อปรับใช้โครงการโดยอัตโนมัติ
โมโน

มันได้ผล! แต่มันไม่ได้ดูสง่างาม ... มันคิดว่ามันจะดีกว่าในโฟลเดอร์ประเภท "ทรัพยากร"
Adams.H

26

คุณสามารถระบุตำแหน่งไฟล์กำหนดค่าด้วยอาร์กิวเมนต์ VM -Dlog4j.configuration = "file: / C: /workspace3/local/log4j.properties"


มันคือไฟล์: / หรือ file: /// หรือ just / path / to / file บนระบบยูนิกซ์?
morpheus

สำหรับ windows มันเป็นแค่ไฟล์: / ฉันเดาว่า unix เหมือนกัน
Amalgovinus

นี่เป็นคำตอบเดียวของ imo ที่คำนึงถึงสภาพแวดล้อมหลายอย่างที่มีระดับการบันทึกต่างกัน
Matt

บน macOS ใน jvm.options ของ Liberty Server จะไม่ใช้เครื่องหมายคำพูดและใช้ไฟล์: ///
wnm3

1
เพียงแค่การอัปเดตซึ่งอาจช่วยประหยัดความยุ่งยาก: หากคุณใช้ log4j2 ชื่อของอาร์กิวเมนต์จะเปลี่ยนเป็นlog4j.configurationFile
dan.m คือ user2321368

17

สำหรับ Maven Based Project ให้ log4j.properties ของคุณอยู่ใน src / main / resources ไม่มีอะไรให้ทำ!


เพียงเท่านี้และก็เหมือนกันสำหรับไฟล์คุณสมบัติอื่น ๆ เช่น XMLConfiguration ใน Maven Projects ขอบคุณ!
Ramon

13

หากคุณใส่ log4j.properties ไว้ใน src คุณไม่จำเป็นต้องใช้คำสั่ง -

PropertyConfigurator.configure("log4j.properties");

มันจะถูกถ่ายโดยอัตโนมัติเมื่อไฟล์คุณสมบัติอยู่ใน classpath



9

ไฟล์ควรอยู่ในไดเร็กทอรี WEB-INF / คลาส โครงสร้างไดเร็กทอรีนี้ควรถูกบรรจุภายในไฟล์ war


ในทางทฤษฎีมันคือคำตอบ แต่ปัญหาคือ log4j.properties หายไปเมื่อ glassfish ปรับใช้ไฟล์สงคราม
โมโน

3
ควรอยู่ใน WEB-INF / คลาสและบรรจุอยู่ในไฟล์ war
Martin OConnor

@mono - อย่างน้อยในไฟล์เก็บถาวรที่ดาวน์โหลดได้จะไม่มี log4j.properties ในเว็บ / WEB-INF / คลาส มาร์ตินพูดถูกที่ควรจะเป็น
fvu

เคล็ดลับคือคุณใส่ไว้ในโฟลเดอร์ src (โฟลเดอร์ต้นทางของคุณ) ในกระบวนการสร้างรหัสของคุณไฟล์จะถูกโอนไปยังโฟลเดอร์คลาสโดยอัตโนมัติ ...
Mostafa Zeinali

7

IDE ของฉันคือ NetBeans ฉันใส่ไฟล์ log4j.property ตามที่แสดงในรูปภาพ

ราก

โฟลเดอร์รากของโครงการ

เว็บ

โฟลเดอร์เว็บ

เว็บ INF

โฟลเดอร์ WEB-INF

ในการใช้ไฟล์คุณสมบัตินี้คุณควรเขียนโค้ดนี้:

package example;

import java.io.File;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.Logger;
import javax.servlet.*;
public class test {

public static ServletContext context;
static Logger log = Logger.getLogger("example/test");

public test() {

        String homeDir = context.getRealPath("/");
        File propertiesFile = new File(homeDir, "WEB-INF/log4j.properties");
        PropertyConfigurator.configure(propertiesFile.toString());
        log.info("This is a test");
    }
}

คุณสามารถกำหนดบริบท ServletContext แบบคงที่จากไฟล์ JSP อื่น ตัวอย่าง:

test.context = getServletContext(); 
test sample = new test(); 

ตอนนี้คุณสามารถใช้ไฟล์ log4j.property ในโปรเจ็กต์ของคุณ


5

คำตอบเฉพาะที่ถูกต้องทางเทคนิคบางคำที่ให้ไว้แล้ว แต่โดยทั่วไปแล้วสามารถอยู่ที่ใดก็ได้บนคลาสพา ธ รันไทม์กล่าวคือทุกที่ที่ JVM ค้นหาคลาส

นี่อาจเป็นไดเร็กทอรี / src ใน Eclipse หรือ WEB-INF / คลาสในแอปที่ปรับใช้ของคุณ แต่ควรคำนึงถึงแนวคิด classpath และสาเหตุที่วางไฟล์ไว้ในนั้นอย่าเพียง แต่ปฏิบัติต่อ WEB-INF / คลาสเป็นไดเร็กทอรี "เวทมนตร์"


5

ฉันใช้เวลานานมากเพื่อหาสาเหตุว่าทำไมจึงไม่เห็นไฟล์log4j.properties
จากนั้นฉันสังเกตเห็นว่าโครงการสามารถมองเห็นได้เฉพาะเมื่ออยู่ในโฟลเดอร์MyProject / target / class /และMyProject / src / main / resources
หวังว่าจะเป็นประโยชน์กับใครบางคน
PS: โครงการนี้มีพื้นฐานมาจาก maven


3

ฉันพบว่าโดยค่าเริ่มต้น Glassfish กำลังดูที่ [ตำแหน่งติดตั้ง Glassfish] \ glassfish \ domains [โดเมนของคุณ] \ เป็นไดเร็กทอรีการทำงานเริ่มต้น ... คุณสามารถวางไฟล์ log4j.properties ในตำแหน่งนี้และเริ่มต้นในโค้ดของคุณโดยใช้ PropertyConfigurator ตามที่กล่าวไว้ก่อนหน้านี้ ...

Properties props = System.getProperties();
System.out.println("Current working directory is " + props.getProperty("user.dir"));
PropertyConfigurator.configure("log4j.properties");

1

ฉันไม่รู้ว่านี่เป็นวิธีที่ถูกต้อง แต่มันช่วยแก้ปัญหาของฉันได้ ใส่ไฟล์ log4j.properties ใน "โฟลเดอร์โครงการ" / config และใช้ PropertyConfigurator.configure ("config // log4j.properties");

มันจะทำงานร่วมกับ IDE แต่ไม่ใช่เมื่อเรียกใช้ไฟล์ jar ด้วยตัวเอง เมื่อคุณรันไฟล์ jar ด้วยตัวเองเพียงแค่คัดลอกไฟล์ log4j.properties ไปยังโฟลเดอร์ที่ไฟล์ jar อยู่เมื่อไฟล์ jar และคุณสมบัติในไดเร็กทอรีเดียวกันจะทำงานได้ดี


1

ใส่ log4j.properties ใน classpath นี่คือ 2 กรณีที่จะช่วยให้คุณระบุตำแหน่งที่เหมาะสม - 1. สำหรับแอปพลิเคชันบนเว็บ classpath คือ / WEB-INF / คลาส

\WEB-INF      
    classes\
        log4j.properties
  1. ในการทดสอบจาก main / unit test classpath คือ source directory

    \Project\
       src\
          log4j.properties
    

1

มีหลายวิธีที่จะทำ:

Way1:หากคุณกำลังพยายามในโครงการ maven โดยไม่ใช้ PropertyConfigurator

ขั้นแรก: ตรวจสอบไดเร็กทอรีทรัพยากรที่ scr / main

  if available,
       then: create a .properties file and add all configuration details.
  else
       then: create a directory named resources and a file with .properties     
write your configuration code/details.

ตามภาพหน้าจอ:

! [ใส่คำอธิบายภาพที่นี่

Way2:หากคุณกำลังพยายามกับไฟล์ Properties สำหรับโปรเจ็กต์ java / maven ให้ใช้ PropertyConfigurator

วางไฟล์คุณสมบัติไว้ที่ใดก็ได้ในโปรเจ็กต์และระบุเส้นทางที่ถูกต้อง พูดว่า: src / javaLog4jProperties / log4j.properties

คงที่{

 PropertyConfigurator.configure("src/javaLog4jProperties/log4j.properties");

}

ป้อนคำอธิบายภาพที่นี่

Way3:หากคุณกำลังลองใช้ xml บนโปรเจ็กต์ java / maven ให้ใช้ DOMConfigurator

วางไฟล์คุณสมบัติไว้ที่ใดก็ได้ในโปรเจ็กต์และระบุเส้นทางที่ถูกต้อง พูดว่า: src / javaLog4jProperties / log4j.xml

คงที่{

 DOMConfigurator.configure("src/javaLog4jProperties/log4j.xml");

}

ป้อนคำอธิบายภาพที่นี่


1

การตั้งค่าโครงการมาตรฐานของคุณจะมีโครงสร้างโครงการดังนี้

src/main/java
src/main/resources

คุณวาง log4j.properties ไว้ในโฟลเดอร์ทรัพยากรคุณสามารถสร้างโฟลเดอร์รีซอร์สได้หากไม่มีอยู่


0

อันที่จริงฉันเพิ่งประสบปัญหานี้ในโครงสร้างโปรเจ็กต์ Java มาตรฐานดังนี้:

\myproject
    \src
    \libs
    \res\log4j.properties

ในคราสฉันจำเป็นต้องเพิ่มความละเอียดในโฟลเดอร์ที่จะสร้างเส้นทางอย่างไรก็ตามใน Intellij ผมต้องทำเครื่องหมายละเอียดโฟลเดอร์เป็นทรัพยากรที่เป็นที่เชื่อมโยงการแสดงภาพหน้าจอ: คลิกขวาที่โฟลเดอร์ละเอียดและทำเครื่องหมายว่าทรัพยากร


0

คุณไม่จำเป็นต้องระบุPropertyConfigurator.configure("log4j.properties");ในคลาส Log4J ของคุณหากคุณได้กำหนด log4j.properties ไว้แล้วในโครงสร้างโปรเจ็กต์ของคุณ

ในกรณีของ Web Dynamic Project: -

คุณต้องบันทึก log4j.properties ของคุณภายใต้ WebContent -> WEB-INF -> log4j.properties

ฉันหวังว่านี่อาจช่วยคุณได้

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