การปิด Log4J Output ใน Java


88

เราจะปิดเอาต์พุตLog4Jทั้งหมดอย่างรวดเร็วโดยใช้log4j.propertiesไฟล์ได้อย่างไร?

คำตอบ:



79

หากคุณต้องการปิดการบันทึกโดยใช้โปรแกรมให้ใช้

List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
loggers.add(LogManager.getRootLogger());
for ( Logger logger : loggers ) {
    logger.setLevel(Level.OFF);
}

5
เขาระบุว่า "ใช้ไฟล์ log4j.properties" อย่างไรก็ตามมันมีประโยชน์มาก
Jaime Hablutzel

1
ขอบคุณสิ่งที่ฉันต้องการ
Jose Martinez

และคุณจะเปลี่ยนกลับไปใช้การตั้งค่าก่อนหน้านี้ (โดยทางโปรแกรม) ได้อย่างไร?
Sachin Sharma

ไม่มีเวทมนตร์เพียงแค่เขียนโปรแกรมง่ายๆ จัดเก็บระดับปัจจุบันในแผนที่ <Logger, Level> ในบริบทที่มีอายุการใช้งานยาวนานจากนั้นย้อนกลับโดยการวนซ้ำบนชุดรายการที่เรียกว่า e.getKey () setLevel (e.getValue ())
Andrew Gilmartin


14

คุณสามารถเปลี่ยนระดับเป็นปิดซึ่งควรกำจัดการบันทึกทั้งหมด ตามเว็บไซต์ log4j ระดับที่ถูกต้องตามลำดับความสำคัญ ได้แก่ TRACE, DEBUG, INFO, WARN, ERROR, FATAL มีระดับหนึ่งที่ไม่มีเอกสารเรียกว่า OFF ซึ่งเป็นระดับที่สูงกว่า FATAL และปิดการบันทึกทั้งหมด

คุณยังสามารถสร้าง root logger พิเศษเพื่อไม่ให้บันทึกอะไรเลย (level OFF) เพื่อให้คุณสามารถสลับ root loggers ได้อย่างง่ายดาย นี่คือโพสต์ที่จะช่วยให้คุณเริ่มต้นได้

คุณอาจต้องการอ่านคำถามที่พบบ่อยของ Log4Jเพราะฉันคิดว่าการปิดการบันทึกทั้งหมดอาจไม่ช่วยอะไร แน่นอนว่าจะไม่ทำให้แอปของคุณเร็วขึ้นมากนักเนื่องจากมีการเรียกใช้รหัสการบันทึกจนถึงจุดที่ log4j ตัดสินใจว่าไม่จำเป็นต้องบันทึกรายการนี้


และข้างใต้ TRACE คือ "ระดับ" ALL สิ่งที่ตรงกันข้าม ประการที่สองอาจเร็วกว่านี้หากโปรแกรมทำบางสิ่งเช่น "if (logger.isDebugEnabled ()) logger.debug (... )"
Tim Büthe

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

4

เปลี่ยนระดับเป็นสิ่งที่คุณต้องการ (ฉันใช้ Log4j2 เวอร์ชัน 2.6.2) นี่เป็นวิธีที่ง่ายที่สุดให้เปลี่ยนเป็น<Root level="off">

ตัวอย่างเช่น: สภาพแวดล้อมการพัฒนาไฟล์log4j2.xml

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

สภาพแวดล้อมการผลิต

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

4

นอกจากนี้ยังสามารถปิดการบันทึกโดยใช้โปรแกรมได้ด้วย:

Logger.getRootLogger().setLevel(Level.OFF);

หรือ

Logger.getRootLogger().removeAllAppenders();
Logger.getRootLogger().addAppender(new NullAppender());

สิ่งเหล่านี้ใช้การนำเข้า:

import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.NullAppender;

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