วิธีการเริ่มต้น log4j อย่างถูกต้อง?


280

หลังจากเพิ่ม log4j ในแอปพลิเคชันของฉันฉันจะได้รับเอาต์พุตต่อไปนี้ทุกครั้งที่เรียกใช้แอปพลิเคชันของฉัน:

log4j: WARN ไม่พบ appenders สำหรับ logger (slideselector.facedata.FaceDataParser)
log4j: WARN โปรดเริ่มต้นระบบ log4j อย่างถูกต้อง

ดูเหมือนว่านี่หมายความว่าไฟล์การกำหนดค่าหายไป ไฟล์กำหนดค่านี้ควรอยู่ที่ใดและเนื้อหาเริ่มต้นที่ดีคืออะไร

ฉันใช้ Java ธรรมดาสำหรับการพัฒนาแอปพลิเคชันเดสก์ท็อป ดังนั้นจึงไม่มีเว็บเซิร์ฟเวอร์ ฯลฯ ...


49
สำหรับพวก Maven ทุกคนอย่างฉัน: ใส่ log4j.properties ลงใน src / main / resources !!
Karussell

เอกสาร log4j มีมากตัวอย่างพื้นฐานของไฟล์ log4j.xml
Ken Bloom

เป็นประโยชน์อย่างมากในการดูคู่มือสั้น ๆ ของ Log4j: logging.apache.org/log4j/1.2/manual.html
Sa'ad

คำตอบ:


278

Log4jโดยค่าเริ่มต้นมองหาไฟล์ที่เรียกว่าlog4j.propertiesหรือlog4j.xmlบน classpath

คุณสามารถควบคุมไฟล์ที่จะใช้ในการเริ่มต้นตัวเองโดยการตั้งค่าคุณสมบัติของระบบตามที่อธิบายไว้ที่นี่ (มองหาส่วน "กระบวนการเริ่มต้นเริ่มต้น")

ตัวอย่างเช่น:

java -Dlog4j.configuration=customName ....

จะทำให้log4jมองหาไฟล์ชื่อ customName บน classpath

หากคุณมีปัญหาฉันพบว่าเป็นประโยชน์ในการเปิด log4j.debug:

-Dlog4j.debug

มันจะพิมพ์ไปที่ System.out ข้อมูลที่เป็นประโยชน์มากมายเกี่ยวกับไฟล์ที่ใช้ในการเริ่มต้นเองซึ่งบันทึก / appenders ได้รับการกำหนดค่าและวิธีการอื่น ๆ

ไฟล์คอนฟิกูเรชันสามารถเป็นไฟล์คุณสมบัติ java หรือไฟล์ xml นี่คือตัวอย่างของรูปแบบไฟล์คุณสมบัติที่นำมาจากหน้าเอกสารแนะนำ log4j :

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

43
ดังนั้นสำหรับการโหลดไฟล์ configuartion จากไฟล์ที่ไม่ได้อยู่ใน classpath คุณต้องทำเช่น: -Dlog4j.configuration = file: / c: /my/folder/log4j.properties ซึ่งจริงๆแล้วเป็น URL
bbcooper

15
เคล็ดลับเล็ก ๆ ที่ใครบางคนอาจพบว่ามีประโยชน์: คุณยังสามารถเปิดดีบักเกอร์log4j ได้โดยเปิดใช้งานคุณสมบัติที่สอดคล้องกันในรหัส - System.setProperty ("log4j.debug", "");
XXL

คุณใส่java -Dlog4j.configuration=customNameที่ไหน ฉันลองการตั้งค่าโครงการ / การกำหนดค่า / เรียกใช้ / การดีบักเลือกการกำหนดค่าบางอย่างคลิกแก้ไขแท็บอาร์กิวเมนต์อาร์กิวเมนต์ VM customName มีส่วนขยาย. xml หรือไม่
Noumenon

2
หลังจากลองหลายรูปแบบการทำงานนี้: -Dlog4j.configuration = ไฟล์: /// C: /mydir/subdir/log4j.properties ตัวอย่างด้านบน: -Dlog4j.configuration = ไฟล์: / c: /my/folder/log4j.properties ล้มเหลว
user1062589

1
ฉันหวังว่าคู่มือจะเน้นมากขึ้นซึ่ง-Dlog4j.debugสามารถช่วยในการดีบักการกำหนดค่าของคุณ
Sridhar Sarnobat

239

ในขณะที่ตั้งค่า log4j อย่างเหมาะสมนั้นยอดเยี่ยมสำหรับโครงการ "ของจริง" คุณอาจต้องการโซลูชันที่รวดเร็วและสกปรกเช่นหากคุณกำลังทดสอบไลบรารีใหม่

ถ้าเป็นเช่นนั้นจะเรียกวิธีการคงที่

org.apache.log4j.BasicConfigurator.configure();

จะตั้งค่าการบันทึกพื้นฐานไปยังคอนโซลและข้อความแสดงข้อผิดพลาดจะหายไป


สวัสดี a3 14_ อินฟินิตี้ที่ฉันควรใช้อันนี้? ฉันไม่เข้าใจ แม้ว่าฉันจะได้รับคำตอบเพิ่มเติมสำหรับปัญหานี้ โปรดช่วยฉันด้วย
Ravi Potnuru

5
โปรดทราบว่าสิ่งนี้จะเป็นค่าเริ่มต้นสำหรับการบันทึกระดับ Debug ซึ่งอาจไม่เป็นที่ต้องการ คุณสามารถเปลี่ยนได้ดังนี้:Logger.getRootLogger().setLevel(Level.INFO);
forresthopkinsa

ไม่ได้ก็ไม่ได้คำเตือนหายไป แต่ผมได้รับการส่งออกบางส่วนที่มีประโยชน์ข้อมูลการแก้ปัญหาในหน้าต่างคอนโซล
อบ Inhalf

2
แดกดัน .. เราใช้มันในสถานะการผลิต
aswzen

25

ถ้าคุณกำจัดทุกอย่าง (เช่นถ้าคุณอยู่ในการทดสอบ)

org.apache.log4j.BasicConfigurator.configure(new NullAppender());

20

ตามหน้าคำถามที่พบบ่อย Apache Log4j :

เหตุใดฉันจึงเห็นคำเตือนเกี่ยวกับ "ไม่พบ appenders สำหรับคนตัดไม้" และ "โปรดกำหนดค่า log4j ให้เหมาะสม"

สิ่งนี้จะเกิดขึ้นเมื่อไฟล์log4j.propertieslog4j.xmlการกำหนดค่าเริ่มต้นและไม่สามารถหาได้และแอปพลิเคชันไม่ได้ทำการกำหนดค่าที่ชัดเจน log4jใช้Thread.getContextClassLoader().getResource()เพื่อค้นหาไฟล์กำหนดค่าเริ่มต้นและไม่ได้ตรวจสอบระบบไฟล์โดยตรง การทราบตำแหน่งที่เหมาะสมในการวาง log4j.properties หรือlog4j.xmlต้องการความเข้าใจกลยุทธ์การค้นหาของคลาสโหลดเดอร์ที่ใช้งานอยู่ log4jไม่ได้กำหนดค่าเริ่มต้นเนื่องจากการส่งออกไปยังคอนโซลหรือระบบไฟล์อาจถูกห้ามในบางสภาพแวดล้อม

โดยพื้นฐานแล้วคำเตือนไม่พบ appenders สำหรับคนตัดไม้ซึ่งหมายความว่าคุณกำลังใช้log4jระบบบันทึก แต่คุณไม่ได้เพิ่ม Appenders ใด ๆ (เช่น FileAppender, ConsoleAppender, SocketAppender, SyslogAppender ฯลฯ ) ลงในไฟล์กำหนดค่าของคุณหรือไฟล์กำหนดค่าคือ หายไป

มีสามวิธีในการกำหนดค่า log4j: ด้วยไฟล์คุณสมบัติ ( log4j.properties), กับไฟล์ XMLและผ่านโค้ด Java ( rootLogger.addAppender(new NullAppender());)

log4j.properties

หากคุณมีไฟล์คุณสมบัติ (เช่นเมื่อติดตั้ง Solr) คุณจะต้องวางไฟล์นี้ไว้ในไดเรกทอรีclasspathของคุณ

classpath

นี่คือคำแนะนำเกี่ยวกับคำสั่งใน Linux วิธีกำหนดค่า classpath ของคุณ:

$ echo $CLASSPATH
$ ps wuax | grep -i classpath
$ grep -Ri classpath /etc/tomcat? /var/lib/tomcat?/conf /usr/share/tomcat?

หรือจาก System.getProperty("java.class.path")Java:

Log4j XML

ด้านล่างเป็นไฟล์การกำหนดค่า XML พื้นฐานสำหรับ log4j ในรูปแบบ XML:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> 
    </layout> 
  </appender> 

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="console" /> 
  </root>
  
</log4j:configuration>

แมวตัวผู้

หากคุณใช้ Tomcat คุณสามารถlog4j.propertiesใส่: /usr/share/tomcat?/lib/หรือ/var/lib/tomcat?/webapps/*/WEB-INF/lib/โฟลเดอร์

Solr

สำหรับการอ้างอิงlog4j.propertiesไฟล์เริ่มต้น Solr ดูเหมือนว่า:

#  Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n

#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9

#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n

log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN

# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF

ทำไม log4j ไม่พบไฟล์คุณสมบัติของฉันในแอปพลิเคชัน J2EE หรือ WAR

คำตอบสั้น ๆ : คลาส log4j และไฟล์คุณสมบัติไม่ได้อยู่ในขอบเขตของ classloader เดียวกัน

Log4j ใช้Class.forName()กลไกเริ่มต้นสำหรับการโหลดคลาสเท่านั้น จัดการทรัพยากรในทำนองเดียวกัน ดูเอกสารประกอบสำหรับjava.lang.ClassLoaderรายละเอียดเพิ่มเติม

ดังนั้นหากคุณมีปัญหาลองโหลดชั้นเรียนหรือแหล่งเรียนรู้ด้วยตัวเอง หากคุณไม่พบมันจะไม่ log4j ;)


ดูสิ่งนี้ด้วย:


12

คุณสามารถตั้งค่าตำแหน่งของ log4j.properties ของคุณจากภายในแอป java ของคุณโดยใช้:

org.apache.log4j.PropertyConfigurator.configure(file/location/log4j.properties)

ข้อมูลเพิ่มเติมมีอยู่ที่นี่: https://logging.apache.org/log4j/1.2/manual.html


1
อืมไม่พบคลาส importคำสั่งอยู่เสมอประโยชน์เช่นจบรหัสไม่ได้ทั้งหมดที่มีความน่าเชื่อถือ
Martin

11

ค้นหา log4j.properties หรือ log4j.xml ออนไลน์ที่มี appender รูทและวางไว้บน classpath ของคุณ

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout

จะเข้าสู่คอนโซล ฉันชอบที่จะเข้าสู่ไฟล์เพื่อให้คุณสามารถตรวจสอบได้ในภายหลัง

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file

แม้ว่าสำหรับแอปพลิเคชันการบันทึก verbose 100KB มักจะต้องเพิ่มเป็น 1MB หรือ 10MB โดยเฉพาะอย่างยิ่งสำหรับการดีบัก

ส่วนตัวฉันตั้งค่าตัวบันทึกหลายตัวและตั้งค่าตัวบันทึกรากเพื่อเตือนหรือระดับข้อผิดพลาดแทนการแก้ปัญหา


9

อีกวิธีในการทำโดยไม่ต้องวางไฟล์คุณสมบัติบน classpath คือการตั้งค่าคุณสมบัติจากรหัส java โดยตรง นี่คือตัวอย่างรหัส

public class Log4JSample {

public static void main(String[] args) {
    Properties properties=new Properties();
    properties.setProperty("log4j.rootLogger","TRACE,stdout,MyFile");
    properties.setProperty("log4j.rootCategory","TRACE");

    properties.setProperty("log4j.appender.stdout",     "org.apache.log4j.ConsoleAppender");
    properties.setProperty("log4j.appender.stdout.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.stdout.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    properties.setProperty("log4j.appender.MyFile", "org.apache.log4j.RollingFileAppender");
    properties.setProperty("log4j.appender.MyFile.File", "my_example.log");
    properties.setProperty("log4j.appender.MyFile.MaxFileSize", "100KB");
    properties.setProperty("log4j.appender.MyFile.MaxBackupIndex", "1");
    properties.setProperty("log4j.appender.MyFile.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.MyFile.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    PropertyConfigurator.configure(properties);

    Logger logger = Logger.getLogger("MyFile");

    logger.fatal("This is a FATAL message.");
    logger.error("This is an ERROR message.");
    logger.warn("This is a WARN message.");
    logger.info("This is an INFO message.");
    logger.debug("This is a DEBUG message.");
    logger.trace("This is a TRACE message.");
}

}


6

คุณสามารถตั้งค่าระดับการบันทึกโดยใช้setLevel ()

ระดับมีประโยชน์ในการกำหนดประเภทของข้อมูลที่คุณต้องการให้โปรแกรมแสดง

ตัวอย่างเช่น:

Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages

ชุดของระดับที่เป็นไปได้คือ:

ติดตาม,

DEBUG,

ข้อมูล,

เตือน,

ข้อผิดพลาดและ

FATAL

ตามคู่มือบริการการบันทึก


6
import org.apache.log4j.BasicConfigurator;

เรียกวิธีนี้

BasicConfigurator.configure();

System.outโดยเฉพาะนี้เขียนไป Javadoc สำหรับวิธีการที่ไม่มีการกำหนดค่า args พูดว่า:Add a ConsoleAppender that uses PatternLayout using the PatternLayout#TTCC_CONVERSION_PATTERN and prints to System.out to the root category.
sunil

3

ต้องการเปิดใช้งาน-Dlog4j.debugผมไปที่ระบบตั้งค่าขั้นสูงระบบตัวแปรสภาพแวดล้อมและตัวแปรระบบชุดไป_JAVA_OPTIONS-Dlog4j.debug


1

คุณกำลังพัฒนาอะไร คุณใช้ Apache Tomcat อยู่หรือเปล่า?

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss.SSS} [[%5p] %c{1} [%t]] %m%n

ฉันมีคุณสมบัติเช่นนี้ในแอป Java ของฉัน


1

log4j ของฉันได้รับการแก้ไขโดยไฟล์คุณสมบัติด้านล่าง:

## direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=./logs/test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file

สวัสดีฉันจะเพิ่ม config สำหรับ debug to console และ error to file ได้อย่างไร
JhonArias

1

ฉันได้สร้างไฟล์log4j.propertiesในโฟลเดอร์ทรัพยากรถัดจากไฟล์hibernate.cfg.xmlและเติมด้วยข้อความด้านล่าง:

log4j.rootLogger=INFO, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n

ตอนนี้ฉันได้กำจัดคำเตือนและข้อผิดพลาด


1

เพียงแค่สร้าง log4j.properties ภายใต้โฟลเดอร์ src / main / assembly ขึ้นอยู่กับว่าคุณต้องการให้ข้อความบันทึกแสดงในคอนโซลหรือในไฟล์ที่คุณแก้ไขไฟล์ ต่อไปนี้จะแสดงข้อความของคุณในคอนโซล

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

1

ตามที่อธิบายไว้ก่อนหน้านี้มี 2 วิธี

วิธีแรกคือเพิ่มบรรทัดนี้ในวิธีการหลักของคุณ:

BasicConfigurator.configure();

วิธีที่สองคือการเพิ่มไฟล์ log4j.properties มาตรฐานนี้ใน classpath ของคุณ:

ในขณะที่ใช้แนวทางที่สองคุณต้องแน่ใจว่าคุณเริ่มต้นไฟล์อย่างถูกต้อง

เช่น.

Properties props = new Properties();

props.load(new FileInputStream("log4j property file path"));

props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");

ตรวจสอบให้แน่ใจว่าคุณสร้างโฟลเดอร์ที่ต้องการเพื่อจัดเก็บไฟล์บันทึก


1

ลองตั้งค่าการดีบักใน log4j: โหนดการกำหนดค่าเป็นจริง

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">

มันพิมพ์ข้อมูลในขณะที่ไฟล์การกำหนดค่าจะถูกอ่านและใช้ในการกำหนดค่าสภาพแวดล้อม log4j คุณอาจได้รับรายละเอียดเพิ่มเติมเพื่อแก้ไขปัญหาของคุณ


มีใครรู้บ้าง ตัวเลือกเดียวกันนี้ยังสามารถใช้งานได้จากการกำหนดค่าคุณสมบัติโดยไม่ต้องย้อนกลับไปที่การตั้งค่า -Dlog4j.debug = true เมื่อเริ่มต้นทำงานจริงหรือไม่
JFK

1

Logging API - Java Logging API ช่วยอำนวยความสะดวกในการให้บริการซอฟต์แวร์และการบำรุงรักษาที่ไซต์ลูกค้าโดยจัดทำรายงานบันทึกที่เหมาะสมสำหรับการวิเคราะห์โดยผู้ใช้ขั้นปลายผู้ดูแลระบบวิศวกรบริการภาคสนามและทีมพัฒนาซอฟต์แวร์ Logging APIs บันทึกข้อมูลเช่นความล้มเหลวด้านความปลอดภัยข้อผิดพลาดในการกำหนดค่าคอขวดประสิทธิภาพและ / หรือข้อบกพร่องในแอปพลิเคชันหรือแพลตฟอร์ม แพคเกจหลักรวมถึงการสนับสนุนสำหรับการส่งข้อความธรรมดาหรือบันทึกการจัดรูปแบบ XML ไปยังหน่วยความจำลำธารเอาท์พุทคอนโซลไฟล์และซ็อกเก็ต นอกจากนี้ API การบันทึกมีความสามารถในการโต้ตอบกับบริการการบันทึกที่มีอยู่แล้วในระบบปฏิบัติการโฮสต์

แพ็คเกจjava.util.logging «จัดเตรียมคลาสและอินเตอร์เฟสของสิ่งอำนวยความสะดวกการบันทึกหลักของแพลตฟอร์ม Java


Log4j 1.x « log4j เป็นยูทิลิตี้การบันทึกข้อมูลบน Java ที่ได้รับความนิยม Log4j เป็นโครงการโอเพ่นซอร์สที่อ้างอิงผลงานของนักเขียนหลายคน จะช่วยให้นักพัฒนาสามารถควบคุมคำสั่งบันทึกที่ส่งออกไปยังสถานที่ต่าง ๆ โดยใช้ Appenders [คอนโซลไฟล์ฐานข้อมูลและอีเมล] สามารถกำหนดค่าได้อย่างสมบูรณ์ที่รันไทม์โดยใช้ไฟล์กำหนดค่าภายนอก

Log4j มีสามองค์ประกอบหลัก:

  • Loggers - [OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE]
  • Appenders

    • Apache Commons การบันทึก: ConsoleAppender, FileAppender, RollingFileAppender, DailyRollingFileAppender, JDBCAppender- Driver, SocketAppender

    • Log4J Appender สำหรับ MongoDB: MongoDbAppender -Driver

  • เลย์เอาต์ - [PatternLayout, EnhancedPatternLayout]

ไฟล์การกำหนดค่าสามารถเขียนในรูปแบบ XML หรือในรูปแบบคุณสมบัติ Java (key = value)

  1. log4j_External.properties รูปแบบ«คุณสมบัติ Java (key = value)

สตริงระหว่างการเปิด " $ { " และการปิด " } " ถูกตีความว่าเป็นกุญแจ ค่าของตัวแปรที่ถูกแทนที่สามารถกำหนดเป็นคุณสมบัติของระบบหรือในไฟล์กำหนดค่าเอง ตั้งค่าตัวเลือกเฉพาะของ appender « log4j.appender.appenderName.option = value สำหรับแต่ละ appender ชื่อคุณสามารถกำหนดค่าเค้าโครง

log4j.rootLogger=INFO, FILE, FILE_PER_SIZE, FILE_PER_DAY, CONSOLE, MySql

#log.path=./
log.path=E:/Logs

# https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
# {%-5p - [WARN ,INFO ,ERROR], %5p 0- [ WARN, INFO,ERROR]}
log.patternLayout=org.apache.log4j.PatternLayout
log.pattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n

# System.out | System.err
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.err
log4j.appender.CONSOLE.layout=${log.patternLayout}
log4j.appender.CONSOLE.layout.ConversionPattern=${log.pattern}

# File Appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log.path}/logFile.log
#log4j:ERROR setFile(null,false) call failed. - Defaults setFile(null,true)
#log4j.appender.FILE.Append = false
log4j.appender.FILE.layout=${log.patternLayout}
log4j.appender.FILE.layout.ConversionPattern=${log.pattern}

# BackUP files for every Day.
log4j.appender.FILE_PER_DAY=org.apache.log4j.DailyRollingFileAppender
# [[ Current File ] - logRollingDayFile.log ], { [BackUPs] logRollingDayFile.log_2017-12-10, ... }
log4j.appender.FILE_PER_DAY.File=${log.path}/logRollingDayFile.log
log4j.appender.FILE_PER_DAY.DatePattern='_'yyyy-MM-dd
log4j.appender.FILE_PER_DAY.layout=${log.patternLayout}
log4j.appender.FILE_PER_DAY.layout.ConversionPattern=${log.pattern}

# BackUP files for size rotation with log cleanup.
log4j.appender.FILE_PER_SIZE=org.apache.log4j.RollingFileAppender
# [[ Current File ] - logRollingFile.log ], { [BackUPs] logRollingFile.log.1, logRollingFile.log.2}
log4j.appender.FILE_PER_SIZE.File=${log.path}/logRollingFile.log
log4j.appender.FILE_PER_SIZE.MaxFileSize=100KB
log4j.appender.FILE_PER_SIZE.MaxBackupIndex=2
log4j.appender.FILE_PER_SIZE.layout=${log.patternLayout}
log4j.appender.FILE_PER_SIZE.layout.ConversionPattern=${log.pattern}

# MySql Database - JDBCAppender
log4j.appender.MySql=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.MySql.driver=com.mysql.jdbc.Driver
log4j.appender.MySql.URL=jdbc:mysql://localhost:3306/automationlab
log4j.appender.MySql.user=root
log4j.appender.MySql.password=
log4j.appender.MySql.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.MySql.layout.ConversionPattern=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');
#log4j.appender.MySql.sql=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');

# Direct log events[Messages] to MongoDB Collection - MongoDbAppender
log.mongoDB.hostname=loalhost
log.mongoDB.userName=Yash777
log.mongoDB.password=Yash@123
log.mongoDB.DB=MyLogDB
log.mongoDB.Collection=Logs

log4j.appender.MongoDB=org.log4mongo.MongoDbAppender
log4j.appender.MongoDB.hostname=${log.mongoDB.hostname}
log4j.appender.MongoDB.userName=${log.mongoDB.userName}
log4j.appender.MongoDB.password=${log.mongoDB.password}
log4j.appender.MongoDB.port=27017
log4j.appender.MongoDB.databaseName=${log.mongoDB.DB}
log4j.appender.MongoDB.collectionName=${log.mongoDB.Collection}
log4j.appender.MongoDB.writeConcern=FSYNCED

โครงสร้างตาราง MySQL สำหรับตาราง logdata

CREATE TABLE IF NOT EXISTS `logdata` (
  `Logger_Level` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
  `DataTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `ClassName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `MethodName` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `LineNumber` int(10) NOT NULL,
  `Message` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  1. log4j_External.xml « XML log4j: การกำหนดค่าด้วยไฟล์ DTD สาธารณะ
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="false">

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE" class="org.apache.log4j.FileAppender">
        <param name="file" value="E:/Logs/logFile.log" />
        <param name="append" value="false" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE_PER_SIZE" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="E:/Logs/logRollingFile.log" />
        <param name="immediateFlush" value="true"/>
        <param name="maxFileSize" value="100KB" />
        <param name="maxBackupIndex" value="2"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE_PER_DAY" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="E:/Logs/logRollingDayFile.log" />
        <param name="datePattern" value="'_'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n"/>
        </layout>
    </appender>

    <root>
        <priority value="info" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="FILE_PER_SIZE" />
        <appender-ref ref="FILE_PER_DAY" />
    </root>
</log4j:configuration>

  1. Log4j Configuration จาก URL ในโปรแกรม Java:

เพื่อที่จะระบุการกำหนดค่าที่กำหนดเองที่มีแฟ้มภายนอกชั้นที่ใช้ต้องใช้อินเตอร์เฟซ Configurator

เมื่อไฟล์กำหนดค่าเริ่มต้น "log4j.properties", "log4j.xml" ไม่สามารถใช้งานได้

  • สำหรับ "log4j.properties" คุณสามารถป้อนไปยังเมธอดPropertyConfigurator .configure (java.net.URL)
  • สำหรับ "log4j.xml" DOMConfiguratorจะถูกนำมาใช้
public class LogFiles {
    // Define a static logger variable so that it references the Logger instance named "LogFiles".
    static final Logger log = Logger.getLogger( LogFiles.class );

    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        System.out.println("CONFIGURATION_FILE « "+LogManager.DEFAULT_CONFIGURATION_FILE);
        System.out.println("DEFAULT_XML_CONFIGURATION_FILE = 'log4j.xml' « Default access modifier");

        String fileName = //"";
                //"log4j_External.xml";
                "log4j_External.properties";
        String configurationFile = System.getProperty("user.dir")+"/src/" + fileName;

        if( fileName.contains(".xml") ) {
            DOMConfigurator.configure( configurationFile );
            log.info("Extension *.xml");
        } else if ( fileName.contains(".properties") ) {
            PropertyConfigurator.configure( configurationFile );
            log.info("Extension *.properties");
        } else {
            DailyRollingFileAppender dailyRollingAppender = new DailyRollingFileAppender();
            dailyRollingAppender.setFile("E:/Logs/logRollingDayFile.log");
            dailyRollingAppender.setDatePattern("'_'yyyy-MM-dd");

            PatternLayout layout = new PatternLayout();
            layout.setConversionPattern( "%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" );
            dailyRollingAppender.setLayout(layout);

            dailyRollingAppender.activateOptions();

            Logger rootLogger = Logger.getRootLogger();
            rootLogger.setLevel(Level.DEBUG);
            rootLogger.addAppender(dailyRollingAppender);

            log.info("Configuring from Java Class.");
        }

        log.info("Console.Message.");
        method2();
        methodException(0);
    }

    static void method2() {
        log.info("method2 - Console.Message.");
    }
    static void methodException(int b) {
        try {
            int a = 10/b;
            System.out.println("Result : "+ a);
            log.info("Result : "+ a);
        } catch (Exception ex) { // ArithmeticException: / by zero
            log.error(String.format("\n\tException occurred: %s", stackTraceToString(ex)));
        }
    }
    public static String stackTraceToString(Exception ex) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        ex.printStackTrace(pw);
        return sw.toString();
    }
}


0

หากเรากำลังใช้ apache คอมมอนส์ wrapper เข้าสู่ระบบด้านบนของ log4j แล้วเราต้องมีขวดทั้งสองที่มีอยู่ใน classpath นอกจากนี้commons-logging.propertiesและlog4j.properties/xmlควรมีอยู่ใน classpath

นอกจากนี้เรายังสามารถผ่านระดับการดำเนินงานและlog4j.propertiesชื่อเป็นทั้งการใช้JAVA_OPTS -Dorg.apache.commons.logging.Log=<logging implementation class name> -Dlog4j.configuration=<file:location of log4j.properties/xml file>เช่นเดียวกันสามารถทำได้ผ่านการตั้งค่าJAVA_OPTSในกรณีที่แอพ / เว็บเซิร์ฟเวอร์

มันจะช่วยให้คุณสมบัติภายนอกที่สามารถเปลี่ยนแปลงได้ในการปรับใช้


0

นี่เป็นอีกวิธีหนึ่งในการใช้. yaml

โครงสร้างลอจิก:

Configuration:
    Properties:
    Appenders:
    Loggers:

ตัวอย่าง:

Configutation:
    name: Default

    Properties:
        Property:
            name: log-path
            value: "logs"

    Appenders:

        Console:
        name: Console_Appender
        target: SYSTEM_OUT
        PatternLayout:
            pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

       File:
          name: File_Appender
          fileName: ${log-path}/logfile.log
          PatternLayout:
            pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

    Loggers:

        Root:
            level: debug
            AppenderRef:
              - ref: Console_Appender

        Logger:
            - name: <package>.<subpackage>.<subsubpackage>.<...>
              level: debug
              AppenderRef:
                 - ref: File_Appender
                 level: error             

Ref: LOG4J 2 การกำหนดค่า: การใช้ YAML


0

สำหรับการทดสอบวิธีที่รวดเร็วและสกปรกรวมถึงการตั้งค่าระดับการบันทึก:

org.apache.log4j.BasicConfigurator.configure();
org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.WARN);

// set to Level.DEBUG for full, or Level.OFF..

0

สารละลาย Maven:

ฉันเจอปัญหาเดียวกันทั้งหมดข้างต้นและสำหรับวิธีแก้ปัญหา maven ฉันใช้การอ้างอิง 2 ครั้ง การกำหนดค่านี้มีไว้สำหรับการทดสอบอย่างรวดเร็วหากคุณต้องการให้โครงการง่าย ๆ ใช้ตัวบันทึกด้วยการกำหนดค่ามาตรฐาน ฉันสามารถจินตนาการว่าคุณต้องการสร้างไฟล์การกำหนดค่าในภายหลังหากคุณต้องการข้อมูลเพิ่มเติมและหรือกำหนดระดับการบันทึกของคุณเองให้เสร็จสมบูรณ์

    <properties>
        <slf4jVersion>1.7.28</slf4jVersion>
    </properties>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4jVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>${slf4jVersion}</version>
        </dependency>

0

ฉันเพิ่งทำสิ่งนี้และปัญหาได้รับการแก้ไขแล้ว

ติดตามบล็อกด้านล่าง

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206875685-How-to-fix-log4j-WARN-console-messages-when-running-an-Application-inside-IntelliJ- ความคิด

แต่ที่นี่เขาพูดเหมือนด้านล่าง

เพื่อแก้ไขปัญหาที่เพิ่งป้อนไฟล์ log4j.resources ต่อไปนี้ลงในโฟลเดอร์ main / resources ของโครงการของคุณ

แทนการสร้าง log4j.resources สร้าง log4j.properties คลิกขวาที่ทรัพยากรใน IntelliJ -> ใหม่ -> ชุดทรัพยากร - เพียงตั้งชื่อเป็น log4j


0

หากคุณมีข้อผิดพลาดนี้ใน Intellij IDEA แม้หลังจากเพิ่มlog4j.propertiesหรือlog4j.xmlไฟล์ในโฟลเดอร์ทดสอบทรัพยากรของคุณบางที Intellij IDEA ยังไม่ทราบเกี่ยวกับการมีอยู่ของไฟล์

ดังนั้นหลังจากที่เพิ่มไฟล์คลิกขวาที่ไฟล์และเลือกrecompile log4j.xml

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