ไฟล์การกำหนดค่า log4j2 XML ที่ง่ายมากโดยใช้ส่วนต่อท้ายของคอนโซลและไฟล์


223

ฉันต้องการไฟล์กำหนดค่า XML ที่ง่ายมากพร้อมคอนโซลและตัวต่อท้ายไฟล์โดยใช้ log4j2

(เว็บไซต์ Apache กำลังฆ่าฉันด้วยข้อมูลมากมาย)


72
ฮ่าฮ่า - ดีใจมากที่คุณพูดแบบนี้ "(เว็บไซต์ Apache กำลังฆ่าฉันด้วยข้อมูลจำนวนมาก)"
2560

19
ประโยคของคุณนั่น(เว็บไซต์ Apache กำลังฆ่าฉันด้วยข้อมูลมากมาย)เป็นเหตุผลหลักที่ฉันดูคำถามของคุณ!
Ju Oliveira

คำตอบ:


281
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

หมายเหตุ:

  • ใส่เนื้อหาต่อไปนี้ในไฟล์กำหนดค่าของคุณ
  • ตั้งชื่อไฟล์การกำหนดค่า log4j2.xml
  • วาง log4j2.xml ในโฟลเดอร์ที่อยู่ใน class-path (เช่นโฟลเดอร์ต้นทางของคุณ "src")
  • ใช้Logger logger = LogManager.getLogger();เพื่อเริ่มต้นคนตัดไม้ของคุณ
  • ผมไม่ตั้งimmediateFlush = "false"ตั้งแต่นี้จะดีกว่าสำหรับอายุการใช้งาน SSD หากคุณต้องการบันทึกทันทีในไฟล์บันทึกของคุณให้ลบพารามิเตอร์หรือตั้งค่าเป็นจริง

1
เพื่อความครบถ้วนสมบูรณ์แนะนำให้ใช้FlFlush = "false" โดยเฉพาะเมื่อใช้ Async Loggers หรือ AsyncAppender
Remko Popma

1
แบ็คกราวน์: ทันทีFlush = "false" อนุญาตให้คอมโพเนนต์ async ของ Log4J2 สามารถแบตช์เข้าด้วยกันหลายเหตุการณ์บันทึกในการเขียนดิสก์แผ่นเดียว เป็นโบนัสกิจกรรมบันทึกล่าสุดของคุณจะถูกเขียนลงดิสก์เสมอและไม่เคยถูกแขวนในบัฟเฟอร์หน่วยความจำ (สิ่งที่ฉันพบน่ารำคาญเกี่ยวกับ log4j-1.2.)
Remko Popma

1
ฉันไม่สามารถ 'รับตัวอย่างบนไซต์ Log4j 2.0 เพื่อทำงาน แต่อันนี้ทำ ขอบคุณ.
djangofan

12
โปรดเพิ่มข้อเท็จจริงที่ว่าอาจจำเป็นต้องมีการทำความสะอาดสำหรับผู้ที่ใช้ eclipse เพื่อมวลมนุษยชาติ
Reut Sharabani

1
@ThorstenNiehues ฉันไม่สามารถแก้ไขความคิดเห็นก่อนหน้าของฉัน แต่ eclipse คัดลอกการกำหนดค่าเมื่อคุณสร้างและด้วยเหตุผลบางอย่างมันไม่ได้คัดลอก log4j.xml เสมอแม้ว่ามันจะมีการเปลี่ยนแปลง อย่างน้อยนั่นคือสิ่งที่แก้ไขสำหรับฉัน
Reut Sharabani

19

นี่คือความง่ายของฉันlog4j2.xmlที่พิมพ์ไปยังคอนโซลและเขียนลงในไฟล์กลิ้งรายวัน:

// java
private static final Logger LOGGER = LogManager.getLogger(MyClass.class);


// log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logPath">target/cucumber-logs</Property>
        <Property name="rollingFileName">cucumber</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
        </Console>
        <RollingFile name="rollingFile" fileName="${logPath}/${rollingFileName}.log" filePattern="${logPath}/${rollingFileName}_%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
            <Policies>
                <!-- Causes a rollover if the log file is older than the current JVM's start time -->
                <OnStartupTriggeringPolicy />
                <!-- Causes a rollover once the date/time pattern no longer applies to the active file -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="rollingFile" />
        </Root>
    </Loggers>
</Configuration>

TimeBasedTriggeringPolicy

interval (จำนวนเต็ม) - ความถี่การโรลโอเวอร์ควรเกิดขึ้นตามหน่วยเวลาที่เจาะจงที่สุดในรูปแบบวันที่ ตัวอย่างเช่นด้วยรูปแบบวันที่ที่มีชั่วโมงเป็นรายการที่เฉพาะเจาะจงที่สุดและการเพิ่ม 4 rollovers จะเกิดขึ้นทุก 4 ชั่วโมง ค่าเริ่มต้นคือ 1

มอดูเลต (บูลีน) - ระบุว่าควรปรับช่วงเวลาเพื่อให้โรลโอเวอร์ครั้งถัดไปเกิดขึ้นในขอบเขตช่วงเวลาหรือไม่ ตัวอย่างเช่นหากรายการเป็นชั่วโมงชั่วโมงปัจจุบันคือ 3 น. และช่วงเวลาคือ 4 ดังนั้นโรลโอเวอร์ครั้งแรกจะเกิดขึ้นที่ 4 น. จากนั้นรายการถัดไปจะเกิดขึ้นในเวลา 8:00 น. เที่ยง 4:00 เป็นต้น

ที่มา: https://logging.apache.org/log4j/2.x/manual/appenders.html

เอาท์พุท:

[INFO ] 2018-07-21 12:03:47,412 ScenarioHook.beforeScenario() - Browser=CHROME32_NOHEAD
[INFO ] 2018-07-21 12:03:48,623 ScenarioHook.beforeScenario() - Screen Resolution (WxH)=1366x768
[DEBUG] 2018-07-21 12:03:52,125 HomePageNavigationSteps.I_Am_At_The_Home_Page() - Base URL=http://simplydo.com/projector/
[DEBUG] 2018-07-21 12:03:52,700 NetIncomeProjectorSteps.I_Enter_My_Start_Balance() - Start Balance=348000

ไฟล์บันทึกใหม่จะถูกสร้างขึ้นทุกวันโดยวันก่อนหน้าจะถูกเปลี่ยนชื่อเป็น:

cucumber_yyyy-MM-dd.log

ในโครงการ Maven คุณจะใส่log4j2.xmlในหรือsrc/main/resources src/test/resources


12

log4j2 มีระบบการกำหนดค่าที่ยืดหยุ่นมาก (ซึ่ง IMHO เป็นสิ่งที่รบกวนมากกว่าความช่วยเหลือ) คุณสามารถใช้ JSON ได้ ดูhttps://logging.apache.org/log4j/2.x/manual/configuration.htmlสำหรับการอ้างอิง

โดยส่วนตัวฉันเพิ่งเริ่มใช้ log4j2 แต่ฉันพุ่งไปที่การตั้งค่า "เข้มงวด XML" (นั่นคือการใช้คุณลักษณะแทนชื่อองค์ประกอบ) ซึ่งสามารถตรวจสอบสคีมา

นี่คือตัวอย่างง่ายๆของฉันโดยใช้การกำหนดค่าอัตโนมัติและโหมดเข้มงวดโดยใช้ "คุณสมบัติ" สำหรับการตั้งชื่อไฟล์:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorinterval="30" status="info" strict="true">
    <Properties>
        <Property name="filename">log/CelsiusConverter.log</Property>
    </Properties>
    <Appenders>
        <Appender type="Console" name="Console">
            <Layout type="PatternLayout" pattern="%d %p [%t] %m%n" />
        </Appender>
        <Appender type="Console" name="FLOW">
            <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n" />
        </Appender>
        <Appender type="File" name="File" fileName="${filename}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="File" />
            <AppenderRef ref="Console" />
            <!-- Use FLOW to trace down exact method sending the msg -->
            <!-- <AppenderRef ref="FLOW" /> -->
        </Root>
    </Loggers>
</Configuration>

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

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