当前位置: 首页 > article >正文

logback之配置文件使用详解

目录

(一)配置文件的加载

(二)使用介绍

1、configuration:配置文件的跟元素

2、contextName:设置日志上下文名称

3、contextListener:设置上下文监听事件

4、property/variable/substitutionProperty:设置变量

5、conversionRule:自定义关键字的转换规则

6、statusListener:配置日志的状态监听器

7、appender:日志事件的输出组件

8、logger:日志记录实例

9、include:内嵌配置文件

(一)配置文件的加载

(1)设置系统变量:logback.configurationFile指定配置文件路径

启动时加入启动参数-Dlogback.configurationFile=/path/log/logback.xml

(2)查找resource下的logback-test.xml(这个通常是单元测试时使用,配置在test/resources下)

(3)查找resource下的logback.xml

(二)使用介绍

先给出一份比较详细的配置文件(注意此配置文件并不一定合理,因为很多标签属性是为了展示其用法而加,实际的配置文件需要根据项目所需设置),然后再对其中标签元素一一介绍

<configuration scan="true" scanPeriod="1 minute" debug="true">
    <!--<turboFilter class=""/>-->
    <!-- Appenders -->
    <!--<contextName>mallLogSystem</contextName>-->
    <!--<contextListener class=""/>-->
    <property name="logPath" value="logs" scope="SYSTEM"/>
    <property name="appName" value="mallSystem"/>
    <!--<property resource="log.properties"/>-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 设置是否在启动时触发之前丢弃的事件 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 设置这个appender的neveQueueSize -->
        <queueSize>512</queueSize>
        <!-- 添加真实的appender -->
        <appender-ref ref="ROLLING"/>
    </appender>

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/${appName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/${appName}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory> <!-- 保留最近30天的日志文件 -->
            <MaxFileSize>10MB</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="impossible" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/${impossibleName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${logPath}/${impossibleName}.%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>16kb</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} %msg%n</pattern>
        </encoder>
        <filter class="com.mall.common.log.LevelRangeFilter">
            <minLevel>WARN</minLevel>
            <maxLevel>ERROR</maxLevel>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <logger name="impossible" additivity="false">
        <appender-ref ref="impossible"/>
    </logger>

    <!-- Root Logger -->
    <root level="Info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="ASYNC"/>
    </root>
</configuration>

1、configuration:配置文件的跟元素

        属性介绍

        scan:true表示会添加一个定时任务检查配置文件是否改变,改变则重新加载,和scanPeriod配合使用。默认为false.

        scanPeriod:扫描周期,支持Duration字符串转换,300 millisecond,1 minute,60 second, 1 hour,1 day。空格将数量和单位分割开。

         debug:true,表示开启日志初始化时的内部日志打印,可以看到日志初始化的一些输出日志。默认是关闭的,日志初始化有问题可以将此项打开,方便看初始化过程。

       packagingData: 如果设置为true,那么设置context中对应的属性为true。此属性控制有异常抛出时,异常堆栈是否包含jar包以及对应版本号,默认为false

2、contextName:设置日志上下文名称

3、contextListener:设置上下文监听事件

        可以监听上下文生命周期的事件,属性class设置监听器的类。监听事件包含:onStart、onReset、onStop、onLevelChange

4、property/variable/substitutionProperty:设置变量

        这3个标签是同一个(历史原因造成),可以定义key-value属性值

        scope:作用域,有3种范围:LOCAL, CONTEXT, SYSTEM。变量的查找顺序是本地,然后是CONTEXT,然后才是SYSTEM。默认是LOCAL。注意SYSTEM实际会设置到系统变量中,所以需要谨慎。

        name:key值

        value:key对应的value。

        file:支持批量配置文件导入,值为文件绝对路径

        resource:配置的是资源文件,相对于resources路径,如:<property resource="log.properties"/>

        name和value是成对出现的,并且和file、resource互斥,即一个property只配置3者其中之一即可

5、conversionRule:自定义关键字的转换规则

        只需要配置class属性,对应的是转换器类。详情可参见《logback之自定义pattern使用的转换器》

6、statusListener:配置日志的状态监听器

        也只需要配置监听器类,只需要实现addStatusEvent即可,然后结合StatusPrinter,可以打印状态事件,在排错方面很有用。

7、appender:日志事件的输出组件

        name:定义一个名称

        class:对应的appender类

        通常有4种appender:ConsoleAppender,FileAppender,RollingFileAppender,AsyncAppender。除了AsyncAppender需要引用实际的appender以外,其余appender都需要定义encoder,以设置日志输出格式:

        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>

        pattern详细介绍,可参加《logback之pattern详解以及源码分析》同时还可以添加过滤器,如下:

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <Level>INFO</Level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        过滤器可自定义,详情可参见另一篇《logback之自定义过滤器》

       (1) ConsoleAppender:输出到控制台,示例如下:

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

       (2)FileAppender:输出到固定的日志文件

    <appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
        <file>${logPath}/${appName}_fix.log</file>
        <append>true</append>
        <prudent>false</prudent>
        <BufferSize>1024</BufferSize>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

        file:设置文件名称,支持变量绑定

        append:是否将日志追加到文件现有内容的末尾,默认为true。

        prudent:是否prudent模式,默认为false。此项开启需谨慎,用于多个进程间的共享文件写入,会加文件锁,所以可能会有性能影响。(如果文件每秒只有30条日志,性能影响不大,但如果每秒超过100以上,那么就可能会有性能问题了)

        BufferSize:缓存区大小。FileAppender用BufferedOutputStream实际输出日志,所以可以设置缓存区大小,默认8096。

       (3)RollingFileAppender:也是输出到日志文件,继承FileAppender,但可以配置滚动策略实现日志滚动,这个在实际生产中用的比较大。如下示例是每天滚动一次文件,最多保留30天的日志。同时还按文件大小滚动,如果文件超过10M也会滚动

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/${appName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/${appName}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory> <!-- 保留最近30天的日志文件 -->
            <MaxFileSize>10MB</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

        继承自FileAppender,所以FileAppender可以设置的属性,它都可以设置。另外增加了RollingPolicy和TriggeringPolicy。设置滚动策略以及滚动触发的策略。SizeAndTimeBasedRollingPolicy继承自TimeBasedRollingPolicy,既是RollingPolicy也是TriggeringPolicy。所以不用额外设置TriggeringPolicy。

        滚动策略和触发策略还可以有如下搭配:

          按文件大小滚动:最多3个滚动文件,超过3个,会把旧的删掉。触发条件按文件大小,下面配置的是16kb。

        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${logPath}/${impossibleName}.%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>16kb</maxFileSize>
        </triggeringPolicy>

        按日期滚动:每天滚动一次,滚动的频率是根据所配置${yyyy-MM-dd}文件日期格式定的,如果配置按月,那么就是${yyyy-MM}

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/logback.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory> <!-- 保留最近30天的日志文件 -->
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

       (4)AsyncAppender:异步日志输出,需要appender-ref指定实际的appender组件。

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>20</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 队列满了不阻塞调用者-->
        <neverBlock>true</neverBlock>
        <!-- 添加真实的appender,最多只能添加一个 -->
        <appender-ref ref="ROLLING"/>
    </appender>

        AsyncAppender是为了不阻塞主线程而使用的,日志不会直接输出,而是放到阻塞队列中。它会开启一个单独的后台线程,从ArrayBlockingQueue中日志获取再调用实际的appender输出日志。

        discardingThreshold:设置队列容量剩余多少时直接丢弃info(包含info)级别以下的日志的阈值。日志容量达到阈值,说明此时日志负载是比较重的,这时保证重要级别的日志输出。默认为-1,表示不限制。

        queueSize:队列的容量

        neverBlock:设置日志事件添加到队列中的方式,如果是neverBlock那么使用offer添加日志事件,那么在日志容量满的情况下是不会阻塞的;但如果是false,那么使用put添加就会阻塞主线程进入等待了。

8、logger:日志记录实例

        标签属性:

        name:logger的名称,有层级关系。如com.example.ClassInfo,那么它父级logger是com.example-》com-》root。所有的logger的根logger都是root。

        level:定义日志级别,如果没有定义则继承父级logger的日志级别。

        additivity:定义日志是否传递到父级,如果为true的话,那么除了会输出到当前logger的appender以外,还会传递给父级的appender。那么一条日志记录会输出到多个日志文件中。默认为true。

        内嵌标签:

                appender-ref:引用的appender

    <logger name="impossible" additivity="false">
        <appender-ref ref="impossible"/>
        <appender-ref ref="fileAppender"/>
    </logger>

9、include:内嵌配置文件

        标签属性:

        file:定义内嵌文件的绝对路径

        url:url形式引入内嵌文件

        resource:相对于resources路径引入内嵌文件

        optional:是否输出解析内嵌配置文件过程中的状态日志,默认是false。

        file、url、resource只能配置其中一个。内嵌文件必须以<included>开头,以<included>结尾。

        如定义一个logProperty.xml:

<included>
    <property name="logPath" value="logs"/>
    <property name="appName" value="mallSystem"/>
</included>

        然后在主配置文件中引入:

        <include resources="logProperty.xml"/>

        


http://www.kler.cn/a/465016.html

相关文章:

  • 145页PPT智慧矿山整体规划建设方案
  • R机器学习:神经网络算法的理解与实操,实例解析
  • Go语言性能优化-字符串格式化优化
  • Kernel Stack栈溢出攻击及保护绕过
  • HTML——79.代码快捷输入方式
  • CentOS — 目录管理
  • 使用 Bash 脚本中的time命令来统计命令执行时间:中英双语
  • 【开源社区openEuler实践】A-ops
  • OCP 认证专家零基础小白
  • Ruby自动化:用Watir库获取YouTube视频链接
  • 【Git系列】Git 分支操作:`git checkout -b test`与`git checkout test`的区别
  • OpenGL变换矩阵和输入控制
  • Linux---自动化工具Ansible模块教程
  • Go gin框架(详细版)
  • 【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始
  • 【Vue】<script setup>和 <script>区别是什么?在使用时的写法区别?
  • flutter组件————Row和Column
  • 【sql】CAST(GROUP_CONCAT())实现一对多对象json输出
  • 办公 三之 Excel 数据限定录入与格式变换
  • 机器学习-感知机-神经网络-激活函数-正反向传播-梯度消失-dropout
  • 无需训练!多提示视频生成最新SOTA!港中文腾讯等发布DiTCtrl:基于MM-DiT架构
  • Windows系统提示ffmpeg.dll丢失怎么解决?
  • 详细讲解外部导入Excel通过命令行形式导数据库中
  • Elasticsearch 在 Java 中的使用教程
  • Golang互斥锁正常模式和饥饿模式的区别
  • 信息科技伦理与道德1:绪论