Làm cách nào tôi có thể định cấu hình Logback để ghi các mức khác nhau cho một logger đến các đích khác nhau?


156

Làm cách nào tôi có thể định cấu hình Logback để ghi các mức khác nhau cho một logger đến các đích khác nhau?

Ví dụ, được đưa ra cấu hình Logback sau, Logback sẽ ghi lại INFOtin nhắn STDOUTERRORtin nhắn tới STDERR?

(Lưu ý rằng ví dụ này là một biến thể của ví dụ logback-examples/src/main/java/chapters/configuration/sample4.xmlđược hiển thị trong Chương 3: Cấu hình 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
trong một bài kiểm tra pop tôi sẽ nói - cái cao hơn :), nhưng nghiêm túc mà nói, console / stdout của bạn sẽ nói gì nếu bạn đăng nhập vào cả hai cấp độ?
kostja

Về ý nghĩ thứ hai, tôi nghĩ câu hỏi mà tôi quan tâm hơn khi trả lời là: "Làm thế nào tôi có thể đăng nhập các cấp độ khác nhau cho một logger đến các điểm đến khác nhau"?
Derek Mahar

Bạn có thể thích bộ lọc tôi đã tạo.
maaartinus

@kostja Đó là câu trả lời đúng. levels are ordered as follows: TRACE < DEBUG < INFO < WARN < ERROR.
Alex78191

Câu trả lời:


62

Cập nhật: Để biết cách tiếp cận dựa trên tất cả cấu hình bằng Groovy, hãy xem câu trả lời của Dean Hiller .

-

Bạn có thể làm một số điều thú vị với bộ lọc Logback . Cấu hình bên dưới sẽ chỉ in thông báo cảnh báo và thông báo lỗi cho thiết bị lỗi chuẩn và mọi thứ khác để xuất ra.

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
Bạn cũng có thể sử dụng logback.qos.ch/manual/filters.html#levelFilter sẽ triển khai các lớp cho bạn ..
Dejell

@Odelya Có, bạn có thể sử dụng bộ lọc cấp độ nhưng bạn sẽ cần xác định nhiều bộ lọc vì cấu hình chỉ chấp nhận mức SINGLE để lắng nghe.
Thợ mộc Uriah

13
@Uriah logback.qos.ch/manual/filters.html#thr NgưỡngFilter sẽ có một phạm vi, thay vì một cấp độ duy nhất
Antony Stubbs

11
Đúng, nhưng yecch !!! Một yêu cầu đơn giản như vậy không nên yêu cầu lập trình Java.
kevin cline

1
bạn không cần bộ lọc cho thiết bị lỗi chuẩn. Xem liên kết này stackoverflow.com/questions/13179773/ Kẻ
Dean Hiller

84

Tôi tin rằng đây sẽ là giải pháp đơn giản nhất:

<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
Bạn muốn sử dụng ThresholdFilters thay thế.
Martin Schröder

vâng, người ta chỉ thực hiện cấp thông tin khi bạn muốn thông tin, gỡ lỗi và theo dõi được ghi vào thiết bị xuất chuẩn mà thay vào đó bị bỏ qua, phải không?
Dean Hiller

Điều này ăn gỡ lỗi và theo dõi?
Stefan

@ MartinSchröder Cho phép sử dụng <filter class="ch.qos.logback.classic.filter.ThresholdFilter">vai trò thực sự của việc chỉ định <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="STDERR" /> </root>trong logback.xml là gì?
neurozen

1
Tìm ra nó - <onMatch><onMismatch>không được xác định cho ThresholdFilter. Đơn giản chỉ cần loại bỏ chúng và nó sẽ hoạt động như dự định.
Charanor

46

Giải pháp chỉ dựa trên cấu hình , với ThresoldFilter và LevelFilters để giữ cho mọi thứ thực sự đơn giản dễ hiểu :

<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
Một chút dài dòng, nhưng tôi thích giải pháp này vì nó rất đơn giản và dễ đọc.
Gondy

@Gondy Tại sao dài dòng? Bạn chỉ có thể sử dụng ThresoldFilter.
Alex78191

Tại sao không sử dụng ThresoldFilterđể STDOUT, thay vì sử dụng năm LevelFilter?
tonarimochi

@ Alex78191, @ tonarimochi Theo như tôi có thể nhớ, ThrưỡngFilter có thể được sử dụng để chấp nhận hoặc từ chối nhật ký với mức cao hơn mức quy định (WARN), nhưng không phải ngược lại. Vì vậy, bạn không thể sử dụng nó để lọc các bản ghi thấp hơn WARN. Nhưng nếu tôi sai, hãy thoải mái cải thiện câu trả lời này hoặc gửi câu trả lời mới.
Sébastien Helbert

31

được rồi, đây là cách xml yêu thích của tôi để làm điều đó. Tôi làm điều này cho phiên bản nhật thực để tôi có thể

  • nhấp vào công cụ để đưa tôi đến báo cáo nhật ký và
  • xem thông tin và bên dưới màu đen và cảnh báo / nghiêm trọng màu đỏ

và vì một số lý do, SO không thể hiện điều này một cách chính xác nhưng dường như hầu hết đều ở đó ...

<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>

Đây là giải pháp lọc tốt nhất để tách thông tin gỡ lỗi theo dõi khỏi cảnh báo và lỗi
kheraud

những gì sẽ là logback.groovyphiên bản của dòng nhìn này?

15

Giải pháp đơn giản nhất là sử dụng ThresholdFiltertrên các appender:

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

Ví dụ đầy đủ:

<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>

Cập nhật: Như Mike đã chỉ ra trong bình luận, các tin nhắn với cấp độ LRI được in ở đây cả STDOUT và STDERR. Dù vậy, không chắc ý định của OP là gì. Bạn có thể thử câu trả lời của Mike nếu đây không phải là điều bạn muốn.


Tôi đang sử dụng logger và root. Appender trong logger được thực thi nhưng appender trong root không được gọi.
Gangadhar JANNU

Gangadhar, đặt addergy = "true" trong trình ghi nhật ký con của bạn (bạn đã ghi đè mặc định).
X. Wo Satuk

1
Cảm ơn ... điều quan trọng là đừng quên thẻ <target> trong ứng dụng STDERR! Nhưng cũng có một vấn đề với điều này: TẤT CẢ đầu ra trên mức bộ lọc được in ... nhưng với thiết bị xuất chuẩn bạn muốn mức ERROR (và ở trên) KHÔNG được in ... hãy xem giải pháp của tôi kết hợp điều này với câu trả lời của S Hébert ...
mike gặm nhấm

10

Đây là cấu hình mà tôi sử dụng, hoạt động tốt, nó dựa trên XML + JaninoEventEvaluator (yêu cầu thư viện Janino phải được thêm vào 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

Tôi sử dụng logback.groovy để định cấu hình logback của mình nhưng bạn cũng có thể làm điều đó với xml config:

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"])

Tôi nghĩ rằng để sử dụng GEventEvaluator đơn giản hơn vì không cần phải tạo các lớp bộ lọc.
Xin thứ lỗi cho trình độ tiếng Anh của tôi!


4

Thử cái này. Bạn chỉ có thể sử dụng tích hợp ThresholdFilterLevelFilter. Không cần phải tạo bộ lọc của riêng bạn theo chương trình. Trong ví dụ này, các mức WARN và ERROR được ghi vào System.err và phần còn lại vào 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

Tôi không tin vào câu trả lời này, vì nó chỉ là sự kết hợp của hai câu trả lời hay nhất ở trên: của X. Wo Satuk và của Sébastien Helbert: ThresholdFilterrất đáng yêu nhưng bạn không thể cấu hình nó để có cấp độ cao hơn cũng như một cấp độ thấp hơn *, nhưng kết hợp nó với hai LevelFiltersbộ thành "DENY" WARNERRORđiều trị.

Rất quan trọng : đừng quên <target>System.err</target>thẻ trong ứng dụng STDERR: thiếu sót của tôi khiến tôi thất vọng trong vài phút.

<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>

* tuy nhiên nó có một phương thức decidetrong API nhưng tôi không biết bạn sẽ sử dụng nó như thế nào trong bối cảnh này.


Đây thực sự là giải pháp tốt nhất, kết hợp Thr ThrFilter và LevelFilter!
geistLich

<target> System.err </ target> để làm gì?
Simran kaur

1

Không cần lập trình. cấu hình làm cho cuộc sống của bạn dễ dàng.

Dưới đây là cấu hình ghi nhật ký mức ghi nhật ký khác nhau vào các tệp khác nhau

<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

Ví dụ về cách xuất thông báo màu ở cấp độ "INFO" hoặc cao hơn cho bảng điều khiển và thông báo ở cấp độ "WARN" hoặc cao hơn cho tệp .

Tệp logback.xml của bạn :

<?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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.