logback配置说明

logback配置说明

官网:https://logback.qos.ch/manual/introduction.html

1.依赖

	<!-- 版本自己加 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>

2.配置文件

配置文件要放在classpath路径下,文件名logback.xml

<!--
参考:https://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy
-->
<!--
根节点<configuration>,其下包含以下三个属性
scan:此属性为true时,配置文件如果发生改变,将会重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,当scan为true时,该属性生效。默认的时间间隔为1分钟。在设置时,如果没有指定时间单位,默认时间单位是毫秒。
debug:当此属性为true时,将打印出logback内部日志信息,实时查看logback运行状态。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!--
    子节点<contextName>用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。可以用<contextName>其他名称来区分不同应用程序的记录,一旦设置,不能修改。
    -->
    <contextName>myName</contextName>

    <!--
    子节点<property>用来定义变量值,通过该标签定义的值会被插入到logger上下文中,可以用"${变量的name}"来取得变量的值,
    其下有两个属性:name表示变量的名称,每一个变量有一个唯一的名称;value表示变量的值,不同的变量可以有相同的值。
    -->
    <property name="logFilePath" value="./log" />

    <!--
    子节点<timestamp>用于获取时间戳字符串,有两个基本属性:
    key用来标识此<timestamp>的名字,
    datePattern设置当前时间转化为字符串的模式,遵循java.txt.SimpleDateFormat的格式。
    timeReference="contextBirth" 每次获取这个变量,都会取当前的时间,加上这句,当前变量就固定为xml配置文件加载时的时间
    -->
    <timestamp key="timestampName" datePattern="yyyy-MM-dd HH:mm:ss"/>
    <timestamp key="timestampName2" datePattern="yyyy-MM-dd HH:mm:ss" timeReference="contextBirth"/>

    <!--
    子节点<appender>用于配置写日志的组件,有两个必要属性:name用于指定appender的名称,每一个appender的名称
    唯一,class指定appender的全限定名。appender有三种类型,分别是:ConsoleAppender、FileAppender、RollingFileAppender,
    ConsoleAppender是把日志输出到控制台,FileAppender是把日志添加到文件,而RollingFileAppender是把日志输出到文件并且定期进行清理。
    -->
    <!-- 控制台输出 -->
    <appender name="ConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </layout>
    </appender>

    <!-- 文件输出,输出到单个文件 -->
    <appender name="FileAppender" class="ch.qos.logback.core.FileAppender">
        <!--被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。-->
        <file>${logFilePath}/FileAppender.log</file>
        <!-- 如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。 -->
        <append>true</append>
        <!--对记录事件进行格式化-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。-->
        <prudent>false</prudent>
    </appender>

    <!-- 文件输出,按照每天/月/年生成日志文件,滚动周期是通过FileNamePattern的%d{yyyy-MM-dd}来推断的 -->
    <appender name="RollingFileAppender"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。 -->
        <file>${logFilePath}/RollingFileAppender.log</file>
        <!--
        当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类,
        "ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"是最常用的滚动策略,它根据时间和大小来制定滚动策略,既负责滚动也负责出发滚动。
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--
            必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,
            默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,
            当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,
            每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
            -->
            <!--日志文件输出的归档文件名-->
            <!--
            文件名可以用来推断滚动周期,至少要有一个%d{},用于推断。
            %d{}可以有多个,但是只能有一个主的,用于推断周期,其他的使用aux来标记为副的
            /var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log
            TimeBasedRollingPolicy支持自动文件压缩。如果fileNamePattern选项的值以结尾,则会启用此功能 例如:/wombat/foo.%d.gz。支持.gz or .zip.

            %d 和 %i 必须存在,不然就不会按天按大小切割
            -->
            <FileNamePattern>${logFilePath}/RollingFileAppender.%d{yyyy-MM-dd}/RollingFileAppender.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--
            可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件
            -->
            <maxHistory>30</maxHistory>
            <maxFileSize>100KB</maxFileSize>
            <!--
            可选的totalSizeCap属性控制所有存档文件的总大小。超过总大小上限时,将异步删除最旧的存档。totalSizeCap属性也需要设置maxHistory属性。
            此外,“最大历史记录”限制总是首先应用,“总尺寸上限”限制总是其次应用。
            totalSizeCap属性可以以字节、千字节、兆字节或千兆字节为单位指定,方法是分别用KB、MB和GB作为数值的后缀。
            例如,5000000、5000KB、5MB和2GB都是有效值,前三个值相等。不带后缀的数值以字节为单位。
            默认情况下,totalSizeCap设置为0,这意味着没有总大小上限。
            -->
            <totalSizeCap>0</totalSizeCap>
            <!--
            如果设置为true,将在appender启动时执行存档删除。默认情况下,此属性设置为false。
            档案移除通常在翻滚期间执行。但是,有些应用程序可能无法持续足够长的时间,无法触发翻滚。因此,对于这样的短期应用程序,归档删除可能永远没有机会执行。
            通过将cleanHistoryOnStart设置为true,可在appender启动时执行存档删除。
            -->
            <cleanHistoryOnStart>false</cleanHistoryOnStart>
        </rollingPolicy>
        <!--
        此选项是通知RollingFileAppender何时激活滚动过程的组件。
        TriggeringPolicy实现负责指示RollingFileAppender何时进行滚动。
        SizeBasedTriggeringPolicy查看当前活动文件的大小。如果其增长大于指定的大小,它将向拥有RollingFileAppender的用户发出信号,以触发现有活动文件的滚动。
        SizeBasedTriggeringPolicy只接受一个参数,即maxFileSize,默认值为10 MB。
        maxFileSize选项可以以字节、千字节、兆字节或千兆字节为单位指定,方法是分别用KB、MB和GB作为数值的后缀。例如,5000000、5000KB、5MB和2GB都是有效值,前三个值相等。
        -->
        <!--
        触发策略,日志文件最大的大小,如果用了SizeAndTimeBasedRollingPolicy或者TimeBasedRollingPolicy,这种自带触发的,不需要再加triggeringPolicy,不然他原本的和这个都不生效了
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>20KB</maxFileSize>
        </triggeringPolicy>
        -->

        <layout class="ch.qos.logback.classic.PatternLayout">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符,有啥参数可以参考PatternLayout-->
            <!--
            %logger{50}
            -->
            <pattern>
                <!--
                %logger                     logger的名字,%logger{10},可以限定输出长度,全类名最后一段不受影响,其他段最多缩短到1个字符
                %class                      调用logger.error()生成日志的类的全类名,%class{10},可以限定输出长度,全类名最后一段不受影响,其他段最多缩短到1个字符
                %contextName                当前配置文件的contextName标签内容
                %d                          时间,可以%d{yyyy-MM-dd HH:mm:ss}格式化
                %file                       调用logger.error()生成日志的类的文件名
                %caller                     调用堆栈
                %line                       源文件中调用logger.error()的行号
                %message                    logger.error()的参数,就是你主要想输出的内容
                %method                     调用logger.error()的那个方法名
                %level                      日志级别,error还是debug
                %thread                     线程名
                %exception                  异常堆栈信息
                %xException                 异常堆栈信息,会说明哪个jar包,例如at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
                %rootException              异常堆栈信息,会一直输出到最上层的root根
                %20logger                   如果不够20字符,则左侧填充空格
                %-20logger                  如果不够20字符,则右侧填充空格
                %.5logger                   如果超过5个字符,则截取
                %10.15logger                不够10个字符就左填充空格,超过15个字符就截取
                %20(%level %logger)         ()是按组应用,%20(%level %logger) 等价于 %20level %20logger
                %highlight(%-5level)        %highlight()高亮显示,只能在控制台用
                %red(%-5level)              %red()标红显示
                %n                          空行
                -->
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </layout>
        <!--
        三个日志过滤器:LevelFilter、ThresholdFilter、EvaluatorFilter
        LevelFilter:严格接受指定级别的日志
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            // 设置日志级别
            <level>ERROR</level>
            // 如果跟该日志水平相匹配,则接受
            <onMatch>ACCEPT</onMatch>
            // 如果跟该日志水平不匹配,则过滤掉
            <onMismatch>DENY</onMismatch>
        </filter>

        ThresholdFilter:接受严重程度大于等于指定级别的日志
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>

        EvaluatorFilter:按照表达式来接受日志
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
                <expression>
                    e.level.toInt() >= WARN.toInt() &amp;&amp;   !(e.mdc?.get("req.userAgent") =~ /Googlebot|msnbot|Yahoo/ )
                </expression>
            </evaluator>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>NEUTRAL</OnMatch>
        </filter>

        DEBUG:输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。
        INFO: 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。
        WARN: 输出警告信息;表明会出现潜在错误的情形。
        ERROR:输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。
        FATAL: 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。

        OFF level > FATAL > ERROR > WARN > INFO > DEBUG > ALL level;范围大的会包含范围小的,
        例如日志设置为INFO级别的话则FATAL、ERROR、WARN、INFO的日志开关都是打开的,而DEBUG的日志开关将是关闭的。

        Log4j或logback建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。
        -->
        <!-- 过滤器,严格接受指定级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ALL</level>
        </filter>
    </appender>

    <!--
    指定包里面的类使用那个appender输出日志
    name:指定关联的package,如果是包名,则需要这样获取logger:Logger log = LoggerFactory.getLogger(WxMessagePushWebApplication.class);只要类在包内就行
            如果是普通名称,例如:fileLogger,那么就需要Logger log = LoggerFactory.getLogger("fileLogger");
    level:表明指记录哪个日志级别以上的日志
    appender-ref:指定logger向哪个文件输出日志信息
    additivity:父级logger是否生效,默认true。如果为false,则只有当前logger生效,父级logger不生效
    -->
    <logger name="com.example.wxmessagepushweb" level="ALL" additivity="true">
        <appender-ref ref="RollingFileAppender" />
    </logger>

    <root level="WARN">
        <appender-ref ref="ConsoleAppender"/>
    </root>
</configuration>

3.使用

public class WxMessagePushWebApplication {

    static public Logger log = LoggerFactory.getLogger(WxMessagePushWebApplication.class);

    public static void main(String[] args) throws Exception {

        for (int j = 0; j < 5; j++) {
            for (int i = 0; i < 1000; i++) {
                log.error("测试日志 error" + i);
            }
            for (int i = 0; i < 1000; i++) {
                log.warn("测试日志 warn" + i);
            }
            for (int i = 0; i < 1000; i++) {
                log.info("测试日志 info" + i);
            }
            for (int i = 0; i < 1000; i++) {
                log.debug("测试日志 debug" + i);
            }
            Thread.sleep(1000);
        }
    }
}

4.整合springboot

springboot的starter里面本身就自带了slf4j、logback的依赖,所以我们不需要额外加。
配置文件的名字可以放在resources目录中,logback.xml、logback-dev.xml、logback-spring.xml,这三种名字都可以,不过spring更推荐-spring结尾的名字。
当然,可以指定位置,需要在spring的配置文件中加上配置,例如:logging.config=./log/logback.xml

posted @ 2022-05-17 17:30  _ME  阅读(800)  评论(0编辑  收藏  举报