ฉันจะกำหนดค่า Logback ให้ล็อกระดับต่าง ๆ สำหรับตัวบันทึกไปยังปลายทางอื่นได้อย่างไร


156

ฉันจะกำหนดค่าLogbackให้ล็อกระดับต่าง ๆ สำหรับตัวบันทึกไปยังปลายทางอื่นได้อย่างไร

ตัวอย่างเช่นเมื่อกำหนดค่า Logback ดังต่อไปนี้จะบันทึกINFOข้อความกลับไปที่STDOUTและERRORข้อความถึงSTDERRหรือไม่

(โปรดทราบว่าตัวอย่างนี้เป็นตัวอย่างที่logback-examples/src/main/java/chapters/configuration/sample4.xmlแสดงในบทที่ 3: การกำหนดค่า Logback )

<configuration>
  <appender name="STDOUT"
   class="ch.qos.logback.core.ConsoleAppender">
   <encoder>
     <pattern>
        %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>
  <appender name="STDERR"
   class="ch.qos.logback.core.ConsoleAppender">
   <encoder>
     <pattern>
        %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
    <target>System.err</target>
  </appender>
  <!-- What is the effective level of "chapters.configuration"? -->
  <logger name="chapters.configuration" level="INFO" additivity="false">
    <appender-ref ref="STDOUT" />
  </logger>
  <logger name="chapters.configuration" level="ERROR" additivity="false">
    <appender-ref ref="STDERR" />
  </logger>

  <!-- turn OFF all logging (children can override) -->
  <root level="OFF">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

1
ในแบบทดสอบป๊อปฉันจะบอกว่า - สูงกว่า :) แต่อย่างจริงจังคอนโซล / stdout ของคุณพูดว่าอะไรถ้าคุณเข้าสู่ระบบทั้งสองระดับ
kostja

ในความคิดที่สองฉันคิดว่าคำถามที่ฉันสนใจจะตอบคือ "ฉันจะบันทึกระดับที่แตกต่างกันสำหรับคนตัดไม้ไปยังปลายทางอื่น" ได้อย่างไร
Derek Mahar

คุณอาจชอบตัวกรองที่ฉันสร้างขึ้น
maaartinus

@kostja เป็นคำตอบที่ถูกต้อง levels are ordered as follows: TRACE < DEBUG < INFO < WARN < ERROR.
Alex78191

คำตอบ:


62

ปรับปรุง: สำหรับวิธีการตั้งค่าทั้งหมดโดยใช้ Groovy ดูคำตอบของคณบดีเลอร์

-

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

logback.xml

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  <target>System.out</target>
  <filter class="com.foo.StdOutFilter" />
   ...
</appender>

<appender name="stderr" class="ch.qos.logback.core.ConsoleAppender">
  <target>System.err</target>
  <filter class="com.foo.ErrOutFilter" />
   ...
</appender>

<logger name="mylogger" level="debug">
    <appender-ref ref="stdout" />
    <appender-ref ref="stderr" />
</logger>

com.foo.StdOutFilter

public class StdOutFilter extends ch.qos.logback.core.filter.AbstractMatcherFilter
{

    @Override
    public FilterReply decide(Object event)
    {
        if (!isStarted())
        {
            return FilterReply.NEUTRAL;
        }

        LoggingEvent loggingEvent = (LoggingEvent) event;

        List<Level> eventsToKeep = Arrays.asList(Level.TRACE, Level.DEBUG, Level.INFO);
        if (eventsToKeep.contains(loggingEvent.getLevel()))
        {
            return FilterReply.NEUTRAL;
        }
        else
        {
            return FilterReply.DENY;
        }
    }

}

com.foo.ErrOutFilter

public class ErrOutFilter extends ch.qos.logback.core.filter.AbstractMatcherFilter
{

    @Override
    public FilterReply decide(Object event)
    {
        if (!isStarted())
        {
            return FilterReply.NEUTRAL;
        }

        LoggingEvent loggingEvent = (LoggingEvent) event;

        List<Level> eventsToKeep = Arrays.asList(Level.WARN, Level.ERROR);
        if (eventsToKeep.contains(loggingEvent.getLevel()))
        {
            return FilterReply.NEUTRAL;
        }
        else
        {
            return FilterReply.DENY;
        }
    }

}

5
คุณยังสามารถใช้logback.qos.ch/manual/filters.html#levelFilterซึ่งจะใช้คลาสสำหรับคุณ ..
Dejell

@Odelya ใช่คุณสามารถใช้ตัวกรองระดับได้ แต่คุณจะต้องกำหนดตัวกรองหลายตัวเนื่องจากการกำหนดค่ายอมรับเฉพาะระดับ SINGLE เท่านั้นที่จะรับฟัง
Uriah Carpenter

13
@Uriah logback.qos.ch/manual/filters.html#thresholdFilterจะใช้ช่วงแทนที่จะเป็นระดับเดียว
แอนโทนีสตับส์

11
ถูกต้อง แต่ yecch !!! ความต้องการง่ายๆเช่นนี้ไม่จำเป็นต้องมีการเขียนโปรแกรมจาวา
วินไคลน์

1
คุณไม่ต้องการตัวกรองสำหรับ stderr ดูลิงค์นี้stackoverflow.com/questions/13179773/…
Dean Hiller

84

ฉันเชื่อว่านี่จะเป็นทางออกที่ง่ายที่สุด:

<configuration>
    <contextName>selenium-plugin</contextName>
    <!-- Logging configuration -->  
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <Target>System.out</Target>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
            <Target>System.err</Target>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder> 
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{10} [%file:%line] %msg%n</pattern> 
        </encoder> 
    </appender>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="STDERR" />
    </root>
</configuration>

37
คุณต้องการใช้ThresholdFilters แทน
Martin Schröder

ใช่แล้วว่าจะทำระดับข้อมูลเมื่อคุณต้องการให้ข้อมูลตรวจแก้จุดบกพร่องและติดตามเพื่อเข้าสู่ระบบ stdout แต่จะถูกละเว้นใช่ไหม?
Dean Hiller

นี้กินแก้ปัญหาและติดตาม?
Stefan

@ MartinSchröderเมื่อใช้ประโยชน์จาก <filter class="ch.qos.logback.classic.filter.ThresholdFilter">อะไรคือระบุจริง<root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="STDERR" /> </root>ใน logback.xml?
neurozen

1
คิดออก - <onMatch>และยังไม่ได้กำหนดไว้สำหรับ<onMismatch> ThresholdFilterเพียงแค่ลบออกและมันจะทำงานตามที่ตั้งใจไว้
Charanor

46

วิธีการแก้ปัญหาขึ้นอยู่กับการตั้งค่าเฉพาะกับ ThresoldFilter และ LevelFilters เพื่อให้สิ่งที่ง่ายมากที่จะเข้าใจ :

<configuration>
    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.err</target>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>WARN</level>
        </filter>
        <encoder>
            <pattern>%date %level [%thread] %logger %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.out</target>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>DEBUG</level>
          <onMatch>ACCEPT</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>INFO</level>
          <onMatch>ACCEPT</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>TRACE</level>
          <onMatch>ACCEPT</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>WARN</level>
          <onMatch>DENY</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>ERROR</level>
          <onMatch>DENY</onMatch>
        </filter>
        <encoder>
            <pattern>%date %level [%thread] %logger %msg%n</pattern>
        </encoder>
    </appender>

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

4
ค่อนข้างละเอียด แต่ฉันชอบวิธีนี้เพราะมันง่ายและอ่านง่าย
Gondy

@Gondy ทำไมต้อง verbose? ThresoldFilterคุณสามารถใช้เฉพาะ
Alex78191

ทำไมไม่ใช้ThresoldFilterเพื่อ STDOUT แทนการใช้ห้าLevelFilter?
tonarimochi

@ Alex78191, @ tonarimochi เท่าที่ฉันจำได้ ThresholdFilter สามารถใช้เพื่อยอมรับหรือปฏิเสธบันทึกที่มีระดับสูงกว่าระดับที่ระบุ (WARN) แต่ไม่ใช่ในทางกลับกัน ดังนั้นคุณไม่สามารถใช้เพื่อกรองบันทึกที่ต่ำกว่า WARN แต่ถ้าฉันผิดโปรดปรับปรุงคำตอบนี้หรือส่งคำตอบใหม่
Sébastien Helbert

31

โอเคนี่คือวิธี xml ที่ฉันชอบที่สุด ฉันทำสิ่งนี้สำหรับเวอร์ชัน eclipse เพื่อให้ฉันสามารถ

  • คลิกที่สิ่งต่างๆเพื่อพาฉันไปยังบันทึกการใช้และ
  • ดูข้อมูลและด้านล่างเป็นสีดำและเตือน / รุนแรงเป็นสีแดง

และด้วยเหตุผลบางอย่างดังนั้นการแสดงทั้งหมดนี้ไม่ถูกต้อง แต่ส่วนใหญ่ดูเหมือนจะอยู่ที่นั่น ...

<configuration scan="true" scanPeriod="30 seconds">

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
          <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
            <expression>
               e.level.toInt() &lt;= INFO.toInt()
            </expression>
          </evaluator>
          <OnMismatch>DENY</OnMismatch>
          <OnMatch>NEUTRAL</OnMatch>
        </filter>

        <encoder>
            <pattern>%date{ISO8601} %X{sessionid}-%X{user} %caller{1} %-4level: %message%n</pattern>
        </encoder>
    </appender>

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
            <level>warn</level>
        </filter>

        <encoder>
            <pattern>%date{ISO8601} %X{sessionid}-%X{user} %caller{1} %-4level: %message%n</pattern>
        </encoder>
        <target>System.err</target>
    </appender>

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

นี่เป็นวิธีการกรองที่ดีที่สุดในการแยกข้อมูลการติดตามการดีบักออกจากคำเตือนและข้อผิดพลาด
kheraud

สิ่งที่จะlogback.groovyรุ่นของเส้นลักษณะนี้หรือไม่?

15

ทางออกที่ง่ายที่สุดคือการใช้ThresholdFilterกับ appenders:

    <appender name="..." class="...">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>

ตัวอย่างเต็มรูปแบบ:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d %-5level: %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <target>System.err</target>
        <encoder>
            <pattern>%d %-5level: %msg%n</pattern>
        </encoder>
    </appender>

    <root>
        <appender-ref ref="STDOUT" />
        <appender-ref ref="STDERR" />
    </root>
</configuration>

อัปเดต: ตามที่ไมค์ชี้ให้เห็นในความคิดเห็นข้อความที่มีระดับข้อผิดพลาดจะถูกพิมพ์ที่นี่ทั้ง STDOUT และ STDERR ไม่แน่ใจว่าเจตนาของ OP เป็นอย่างไร คุณสามารถลองคำตอบของ Mike ได้หากนี่ไม่ใช่สิ่งที่คุณต้องการ


ฉันใช้คนตัดไม้และรูต appenders ใน logger จะถูกเรียกใช้งาน แต่ appenders in root จะไม่ถูกเรียกใช้
Gangadhar JANNU

Gangadhar ตั้งค่าความไว = "จริง" ในตัวบันทึกลูกของคุณ (คุณแทนที่ค่าเริ่มต้น)
X. Wo Satuk

1
ขอบคุณ ... สำคัญอย่าลืมแท็ก <target> ใน appder ของ STDERR! แต่ยังมีปัญหากับสิ่งนี้: เอาต์พุตทั้งหมดที่อยู่เหนือระดับตัวกรองถูกพิมพ์ ... แต่ด้วย stdout คุณต้องการระดับข้อผิดพลาด (และสูงกว่า) ที่จะไม่พิมพ์ ... ดูโซลูชันของฉันซึ่งผสมผสานสิ่งนี้กับคำตอบของ S Hébert ...
mike rodent

10

นี่คือการกำหนดค่าที่ฉันใช้ซึ่งใช้งานได้ดีขึ้นอยู่กับ XML + JaninoEventEvaluator (ต้องเพิ่มไลบรารีJaninoใน Classpath)

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date | [%-5level] in [%file:%line] - %msg %n</pattern>
    </encoder>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
            <expression>
                level &lt;= INFO
            </expression>
        </evaluator>
        <OnMismatch>DENY</OnMismatch>
        <OnMatch>NEUTRAL</OnMatch>
    </filter>
</appender>
<appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
    <target>System.err</target>
    <encoder>
        <pattern>%date | [%-5level] in [%file:%line] - %msg %n</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>WARN</level>
    </filter>
</appender>

<root level="DEBUG">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="STDERR" />
</root>
</configuration>  

8

ฉันใช้ logback.groovy เพื่อกำหนดค่า logback ของฉัน แต่คุณสามารถทำได้ด้วยการกำหนดค่า xml เช่นกัน:

import static ch.qos.logback.classic.Level.*
import static ch.qos.logback.core.spi.FilterReply.DENY
import static ch.qos.logback.core.spi.FilterReply.NEUTRAL
import ch.qos.logback.classic.boolex.GEventEvaluator
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.ConsoleAppender
import ch.qos.logback.core.filter.EvaluatorFilter

def patternExpression = "%date{ISO8601} [%5level] %msg%n"

appender("STDERR", ConsoleAppender) {
    filter(EvaluatorFilter) {
      evaluator(GEventEvaluator) {
        expression = 'e.level.toInt() >= WARN.toInt()'
      }
      onMatch = NEUTRAL
      onMismatch = DENY
    }
    encoder(PatternLayoutEncoder) {
      pattern = patternExpression
    }
    target = "System.err"
  }

appender("STDOUT", ConsoleAppender) {
    filter(EvaluatorFilter) {
      evaluator(GEventEvaluator) {
        expression = 'e.level.toInt() < WARN.toInt()'
      }
      onMismatch = DENY
      onMatch = NEUTRAL
    }
    encoder(PatternLayoutEncoder) {
      pattern = patternExpression
    }
    target = "System.out"
}

logger("org.hibernate.type", WARN)
logger("org.hibernate", WARN)
logger("org.springframework", WARN)

root(INFO,["STDERR","STDOUT"])

ฉันคิดว่าการใช้ GEventEvaluator นั้นง่ายกว่าเพราะไม่จำเป็นต้องสร้างคลาสตัวกรอง
ฉันขอโทษสำหรับภาษาอังกฤษของฉัน!


4

ลองสิ่งนี้ คุณก็สามารถใช้ในตัวและThresholdFilter LevelFilterไม่จำเป็นต้องสร้างตัวกรองของคุณเองโดยทางโปรแกรม ในตัวอย่างนี้ระดับ WARN และข้อผิดพลาดจะถูกบันทึกไว้ที่ System.err และเข้าสู่ System.out:

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <!-- deny ERROR level -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>DENY</onMatch>
    </filter>
    <!-- deny WARN level -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>WARN</level>
        <onMatch>DENY</onMatch>
    </filter>
    <target>System.out</target>
    <immediateFlush>true</immediateFlush>
    <encoder>
        <charset>utf-8</charset>
        <pattern>${msg_pattern}</pattern>
    </encoder>
</appender>

<appender name="stderr" class="ch.qos.logback.core.ConsoleAppender">
    <!-- deny all events with a level below WARN, that is INFO, DEBUG and TRACE -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>WARN</level>
    </filter>
    <target>System.err</target>
    <immediateFlush>true</immediateFlush>
    <encoder>
        <charset>utf-8</charset>
        <pattern>${msg_pattern}</pattern>
    </encoder>
</appender>   

<root level="WARN">
    <appender-ref ref="stderr"/>
</root>

<root level="TRACE">
    <appender-ref ref="stdout"/>
</root>


3

ฉันไม่ได้ให้เครดิตสำหรับคำตอบนี้เนื่องจากเป็นการรวมกันของสองคำตอบที่ดีที่สุดข้างต้น: ของ X. Wo Satuk และของSébastien Helbert: ThresholdFilterน่ารัก แต่คุณไม่สามารถกำหนดให้มีระดับที่สูงขึ้นเช่นเดียวกับ ระดับที่ต่ำกว่า * แต่รวมเข้ากับLevelFiltersชุดที่สองเป็น "DENY" WARNและERRORใช้การรักษา

สำคัญมาก : อย่าลืม<target>System.err</target>แท็กใน appender STDERR: การละเว้นของมันทำให้ฉันหงุดหงิดสักสองสามนาที

<configuration>
    <timestamp key="byDay" datePattern="yyyyMMdd'T'HHmmss" />
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>DENY</onMatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\)
                - %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <target>System.err</target>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\)
                - %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="STDERR" />
    </root>
</configuration>

* มันมีวิธีการdecideในAPIแต่ฉันก็ไม่รู้ว่าคุณจะใช้มันอย่างไรในบริบทนี้


นี่เป็นทางออกที่ดีที่สุดโดยรวม ThresholdFilter และ LevelFilter!
geistLich

<target> System.err </target> มีไว้ทำอะไร
Simran kaur

1

ไม่จำเป็นต้องเขียนโปรแกรม การกำหนดค่าทำให้ชีวิตของคุณง่ายขึ้น

ด้านล่างคือการกำหนดค่าซึ่งบันทึกระดับการบันทึกต่าง ๆ ไปยังไฟล์ต่าง

<property name="DEV_HOME" value="./logs" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n
        </Pattern>
    </layout>
</appender>

<appender name="FILE-ERROR"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/app-error.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/app-error.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <!--output messages of exact level only -->
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>
<appender name="FILE-INFO"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/app-info.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/app-info.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>


    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <!--output messages of exact level only -->
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>


<appender name="FILE-DEBUG"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/app-debug.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/app-debug.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>DEBUG</level>
        <!--output messages of exact level only -->
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

<appender name="FILE-ALL"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${DEV_HOME}/app.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${DEV_HOME}/archived/app.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
</appender>

<logger name="com.abc.xyz" level="DEBUG" additivity="true">
    <appender-ref ref="FILE-DEBUG" />
    <appender-ref ref="FILE-INFO" />
    <appender-ref ref="FILE-ERROR" />
    <appender-ref ref="FILE-ALL" />
</logger>

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


0
<configuration scan="true" scanPeriod="60 seconds">
 <appender name="A1" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${storm.log.dir}/${logfile.name}</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>${storm.log.dir}/${logfile.name}.%i</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>9</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>100MB</maxFileSize>
    </triggeringPolicy>

    <encoder>
      <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} %c{1} [%p] %m%n</pattern>
    </encoder>
 </appender>

 <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${storm.log.dir}/access.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>${storm.log.dir}/access.log.%i</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>9</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>100MB</maxFileSize>
    </triggeringPolicy>

    <encoder>
      <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} %c{1} [%p] %m%n</pattern>
    </encoder>
  </appender>

  <appender name="METRICS" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${storm.log.dir}/metrics.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>${storm.log.dir}/logs/metrics.log.%i</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>9</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>2MB</maxFileSize>
    </triggeringPolicy>

    <encoder>
      <pattern>%d %-8r %m%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="A1"/>
  </root>

  <logger name="backtype.storm.security.auth.authorizer" additivity="false">
    <level value="INFO" />
    <appender-ref ref="ACCESS" />
  </logger>

  <logger name="backtype.storm.metric.LoggingMetricsConsumer" additivity="false" >
    <level value="INFO"/>
    <appender-ref ref="METRICS"/>
  </logger>

</configuration>

So here is the logback file in which I am not printing backtype.storm.metric.LoggingMetricsConsumer info level if i say additivity = "true" then for for all classes in backtype.* this rule will be applied

0

ตัวอย่างของข้อความวิธีการส่งออกสีของระดับ "ข้อมูล" หรือสูงกว่าเพื่อปลอบใจและข้อความของระดับ "เตือน" หรือสูงกว่าเพื่อไฟล์

ไฟล์logback.xmlของคุณ:

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

<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>

            <!--output messages of exact level only-->
            <!--<onMatch>ACCEPT</onMatch>-->
            <!--<onMismatch>DENY</onMismatch>-->
        </filter>
        <encoder>
            <pattern>%d{yyyy-MMM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n
            </pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>myfile.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <append>true</append>
        <encoder>
            <pattern>%d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE"/>
    </root>
</configuration>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.