การกำหนดค่า log4j ผ่านอาร์กิวเมนต์ JVM?


133

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

หมายเหตุ: ฉันต้องการหลีกเลี่ยงการสร้างไฟล์ log4j.properties ในแอปพลิเคชัน


2
ผู้อ่านระวัง: สิ่งสำคัญคือต้องสังเกตว่าคำถามกำลังถามเกี่ยวกับ log4j ไม่ใช่ log4j2
neves

คำตอบ:


161

คุณมีไฟล์กำหนดค่า log4j หรือไม่? เพียงอ้างอิงโดยใช้

-Dlog4j.configuration={path to file}

โดยที่ {path to file} ควรขึ้นต้นด้วย file:

แก้ไข:หากคุณกำลังทำงานกับ log4j2 คุณต้องใช้ไฟล์

-Dlog4j.configurationFile={path to file}

นำมาจากคำตอบhttps://stackoverflow.com/a/34001970/552525


Brian - ไม่ใช่สิ่งที่ฉันกำลังมองหา แต่ฉันคิดว่ามันเป็นการประนีประนอมที่ดีระหว่างการย้ายไฟล์ไปยังแอปพลิเคชันของฉันและการตั้งค่าคุณสมบัติผ่านทาง JVM args
jconlin

ฉันคิดว่าเมื่อแอปพลิเคชันของคุณมีความซับซ้อนมากขึ้น (ถ้าเป็นเช่นนั้น) ไฟล์จะสามารถจัดการได้มากขึ้นเมื่อคุณกำหนดค่ามากขึ้น อย่างไรก็ตามฉันยอมรับว่าฉันคาดเดาถึงกรณีการใช้งานของคุณที่นี่
Brian Agnew

25
{path to file}ต้องนำหน้าด้วยfile:จึงจะใช้งานได้
หรือผู้ทำแผนที่

2
@ORMapper - ฉันได้แก้ไขอย่างเหมาะสม
Brian Agnew

6
ระวังว่าใช้Log4j 2เนื่องจากชื่อคุณสมบัติและไวยากรณ์เปลี่ยนไปหรือไม่ ดูคำตอบนี้
José Andias

161

โซลูชันนี้ใช้อาร์กิวเมนต์ JVM ต่อไปนี้:

-Dlog4j.configuration={path to file}

หากไฟล์ไม่ได้อยู่ใน classpath ( WEB-INF/classesในกรณีของ Tomcat) แต่อยู่ที่ไหนสักแห่งบนดิสก์ของคุณให้ใช้file:เช่น

-Dlog4j.configuration=file:C:\Users\me\log4j.xml

ข้อมูลเพิ่มเติมและตัวอย่างที่นี่: http://logging.apache.org/log4j/1.2/manual.html


2
สำหรับ Logback:-Dlogback.configurationFile=C:\logback-test.xml
30

2
+1 สำหรับไฟล์ที่กล่าวถึง (ย้ำสิ่งที่ Tim พูดสิ่งนี้ทำให้ฉันคลั่งไคล้ log4j หลายครั้ง
javadba

13
อาร์กิวเมนต์ JVM อื่นที่มีประโยชน์มากในการดีบัก log4j config:-Dlog4j.debug
KC

2
เป็นไปได้ไหมที่จะใช้เส้นทางสัมพัทธ์กับวิธีนี้
AaA

33

สิ่งนี้ดูเหมือนจะเปลี่ยนไป (อาจใช้ log4j2) เป็น:

-Dlog4j.configurationFile=file:C:\Users\me\log4j.xml

ดู: https://logging.apache.org/log4j/2.x/manual/configuration.html


สิ่งนี้ทำให้ฉันมีข้อยกเว้นดังต่อไปนี้ C: \ Development \ Eclipses \ EclipseMars \ file: C: \ Users \ ABC \ log4j2.xml ฉันจะสร้างเส้นทางแบบสัมบูรณ์ได้อย่างไร
Cybermonk

สำหรับ Docker Containers ฉันใช้JAVA_PARAMS="-Dlog4j.configurationFile=classpath:log4j2-container.xml"ถ้า Docker Image รองรับการแทนที่ JAVA_PARAMS ด้วย env vars และไฟล์อยู่ใน Jar
Marcello de Sales

21

ฉันรู้ว่ามีคำตอบอยู่แล้ว แต่เนื่องจากคุณบอกว่านี่ไม่ใช่สิ่งที่คุณกำลังมองหาฉันจึงขอชี้ให้เห็นทางเลือกต่อไปนี้:

คุณยังสามารถใช้คลาสคอนฟิกูเรชันแทนคุณสมบัติหรือไฟล์ xml

-Dlog4j.configuratorClass=com.foo.BarConfigurator

ดูรายละเอียดhttp://logging.apache.org/log4j/1.2/manual.html


1
นี่เป็นวิธีแก้ปัญหาที่ถูกต้องหากมีผู้ต้องการหลีกเลี่ยงการสร้างไฟล์กำหนดค่า ภายในคลาส Configurator ที่คุณกำหนดเองคุณสามารถเรียก BasicConfigurator () หรือสร้าง Loggers และ Appenders ของคุณเองได้ตามที่คุณต้องการ แต่ฉันชอบไฟล์ config มากกว่า!
skiphoppy

11

โดยทั่วไปตราบเท่าที่ไฟล์ log4j.properties ของคุณอยู่บน classpath Log4j ควรเลือกโดยอัตโนมัติเมื่อเริ่มต้น JVM


1
นี่เป็นความจริง: จำเป็นต้องใช้ -Dlog4j.configuration ถ้าไฟล์ไม่ได้อยู่ใน classpath หรือถ้าคุณต้องการใช้ไฟล์ที่ไม่ใช่ไฟล์แรกที่พบใน classpath
javadba

8

ช่วงสายของงานปาร์ตี้ตั้งแต่ปี 2015 Log4J 1.x มาถึงEOLแล้ว

Log4J 2.x เป็นต้นไปตัวเลือก JVMควรเป็น-Dlog4j.configurationFile=<filename>


PS <filename>อาจจะเป็นไฟล์ที่สัมพันธ์กับเส้นทางการเรียนโดยไม่ต้องfile:ตามที่แนะนำในคำตอบอื่น ๆ


2
คำตอบที่สำคัญเนื่องจากคำตอบอื่นใช้ไม่ได้อีกต่อไป
Yossale

1

เส้นทางสัมพัทธ์ก็ใช้ได้เช่นกัน:

java -Dlog4j.configuration=file:".\log4j.properties" -jar com.your-1.0-SNAPSHOT.jar

หรือ

java -Dlog4j.configuration=file:".\log4j.xml" -jar com.your-1.0-SNAPSHOT.jar

0

หากคุณใช้ gradle คุณสามารถใช้ปลั๊กอิน 'aplication' และใช้คำสั่งต่อไปนี้

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