logback

logback的架构


logback-core:基础模块, 为其它的两个模块提供支持
logback-classic:是log4j的改进版本, 并且此模块实现了slf4j api, 所以可以很容易切换至其它日志框架。

如何使用

logback-classic模块所需的依赖:slf4j-api.jar, logback-core.jar, logback-classic.jar

日志级别

TRACE < DEBUG < INFO < WARN < ERROR

方法打印以及基本选择原则

根据定义,打印的方法决定的日志的级别。例如:L 是一个 logger 实例,L.info("...") 的日志级别就是 INFO。

如果一条的日志的打印级别大于 logger 的有效级别,该条日志才可以被打印出来。这条规则总结如下:

  • 日志的打印级别为 p,Logger 实例的级别为 q,如果 p >= q,则该条日志可以打印出来。
  • 日志的实例级别:对于一个给定名为L的logger,它的有效层级为从自身一直回溯到root logger, 直到找到第一个不为空的层级作为自己的层级。root logger的默认级别为 debug

logback 的配置


配置文件中使用变量

直接定义

<configuration>
    <property name="USER_NAME" value="/data/logs" />

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${USER_NAME}/myApp.log</file>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

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

将多个变量配置在一个文件中

<configuration>
    <property file="F:projectlogback-examplessrcmain
esourcesvariables1.properties"/>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${USER_HOME}/myApp.log</file>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

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

variables1.properties:

USER_HOME=/data/logs

使用classpath中的文件

<configuration>
    <property resource="resource1.properties" />

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${USER_HOME}/myApp.log</file>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

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

变量的默认名

在某些情况下,如果某个变量没有被声明,或者为空,默认值则非常有用。在 bash shell 中,默认值可以通过 ":-" 来指定。例如:假设变量 aName 没有被定义,"${aNme:-golden}" 会被解释成 "golden" 。

filter过滤器

  • 使用情况1:我只想把info级别的日志写入到名为logFile-info.log文件中:

    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>logFile-info.log</file>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--             按天轮转 -->
                <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
                <!--             保存 30 天的历史记录,最大大小为 30GB -->
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </encoder>
    </appender>
    

    在此情况下,文件中只有info级别的日志,即使warn、error级别高于info也不会打印

  • 使用情况2:我想把info级别以上的日志都写入到文件中:

    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>logFile-info.log</file>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--             按天轮转 -->
                <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
                <!--             保存 30 天的历史记录,最大大小为 30GB -->
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </encoder>
    </appender>
    

    在此情况下,高于info级别的日志信息会保存在文件中。它们之间的区别在于标签中的class

原文地址:https://www.cnblogs.com/kongieg/p/14179606.html