เข้าสู่ระบบเพื่อบันทึกข้อความที่แตกต่างกันไปยังสองไฟล์


146

ฉันใช้ logback / slf4j เพื่อทำการบันทึกของฉัน ฉันต้องการแยกวิเคราะห์ไฟล์บันทึกของฉันเพื่อวิเคราะห์ข้อมูลบางอย่างดังนั้นแทนที่จะแยกวิเคราะห์ไฟล์ขนาดใหญ่ที่ดี (ส่วนใหญ่ประกอบด้วยคำสั่ง debug) ฉันต้องการมีอินสแตนซ์ของตัวบันทึกสองตัวที่แต่ละล็อกไปยังไฟล์แยกกัน หนึ่งชุดสำหรับการวิเคราะห์และอีกชุดสำหรับการบันทึกอเนกประสงค์ ไม่มีใครรู้ว่าเป็นไปได้ด้วย Logback หรือคนตัดไม้อื่น ๆ สำหรับเรื่องนั้น?

คำตอบ:


296

เป็นไปได้มากที่จะทำสิ่งนี้ในล็อกแบ็ค นี่คือตัวอย่างการกำหนดค่า:

<?xml version="1.0"?>
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logfile.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender">
        <file>analytics.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <!-- additivity=false ensures analytics data only goes to the analytics log -->
    <logger name="analytics" level="DEBUG" additivity="false">
        <appender-ref ref="ANALYTICS-FILE"/>
    </logger>
    <root>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

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

Logger analytics = LoggerFactory.getLogger("analytics");

1
ฉันต้องทำสิ่งนี้เพื่อที่ฉันจะได้มี appender แบบไม่ต้องป้อนข้อมูลและ appender ปกติกับไฟล์เดียวกัน ขอบคุณสำหรับข้อมูลนี้
djangofan

IMO additivity = false ควรเป็นค่าเริ่มต้นหากมีการระบุ appender-ref ต่างกัน บ่อยครั้งมากที่เราได้รับแอปพลิเคชั่นซึ่งบางโมดูลจะเป็นตัวสร้างบันทึกบ่อยมากเนื่องจากเหตุการณ์ตัวจับเวลาและเราต้องการแยกบันทึกเหล่านั้นออกเป็นไฟล์ต่าง ๆ การเข้าสู่ระบบเดียวกันใน 10 ไฟล์ที่แตกต่างกันจริงๆไม่สมเหตุสมผล ดังนั้นจึงควรเลือกใช้คุณลักษณะที่ไม่ใช่ค่าเริ่มต้น ตั้งแต่การเข้าสู่ระบบกลับเป็นการเขียนซ้ำความผิดพลาดเดียวกันควรได้รับการแก้ไขโดยผู้เขียนคนเดียวกัน
samarjit samanta

ฉันต้องการบันทึกข้อผิดพลาดแก้ปัญหาข้อความข้อมูลในไฟล์ต่าง ๆ ตามลำดับ เป็นไปได้ด้วย logback.xml
Qasim

@Qasim - เป็นไปได้ ดู - amitstechblog.wordpress.com/2014/09/27/ …
Andy Dufresne

ฉันพยายามที่จะบันทึกล็อกจากแพ็คเกจที่แตกต่างกันไปยังไฟล์ที่แตกต่างกันเช่นคำแนะนำนี้แนะนำ แต่มันไม่ทำงานสำหรับฉัน สารสกัดจาก logback XML ของฉันอยู่ที่นี่ - pastebin.com/Aii4f1Jk ฉันกำลังพยายามที่จะบันทึกแพคเกจการจำศีลระดับการติดตามแพคเกจแฟ้มอื่น ข้อเสนอแนะใด ๆ
Andy Dufresne

7

คุณสามารถมีคนตัดไม้ได้มากเท่าที่คุณต้องการ แต่จะดีกว่าถ้าคุณมีหนึ่งแพ็คเกจสำหรับแต่ละแพ็คเกจที่คุณต้องบันทึกต่าง จากนั้นคลาสทั้งหมดในแพ็คเกจนั้นและแพ็คเกจย่อยจะได้รับตัวบันทึกเฉพาะนั้น พวกเขาทุกคนสามารถแชร์ root logger และส่งข้อมูลบันทึกของพวกเขาไปยัง appger root logger โดยใช้ additivity = "true" นี่คือตัวอย่าง:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36} 
%X{akkaSource} [%file:%line] - %m%n" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern>
    </encoder>
</appender>

<appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/worker.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/transformer.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<logger name="com.xxx.yyy.zzz" level="INFO" additivity="true">
    <appender-ref ref="xyz"/>
</logger>

<logger name="com.aaa.bbb.ccc" level="INFO" additivity="true">
    <appender-ref ref="abc"/>
</logger>

<root>
    <level value="INFO" />
    <appender-ref ref="STDOUT" />
</root>


2

ในกรณีของฉันฉันต้องการออกจากชื่อชั้นเป็นชื่อบันทึก

private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class);

และในขณะที่ฉันมีชั้นเรียนดังกล่าวไม่กี่ดังนั้นของฉัน logback.xml

<!--additivity=false ensures this log data only goes to the this log, and no one more -->
<logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.