logback新认识(一):logback主要组件appender、rollingPolicy和triggeringPolicy的使用和理解

logback日志必备。平时在新建项目的时候都是Ctrl+CCtrl+V,完全不要自己做什么,不管使用Springmvc还是Springboot都不需要配置logback.xml文件的位置,直接将logback.xml放到resources目录下,命令符合要求即可。但是真正懂或者了解logback里面的各项配置的却少之又少。现在工作闲暇时间看了一下官方的文档,然后自己操作一下,算是入门,不再像之前那么懵比。

logback的主要组成部分

  • appender,是用来定义一个写日志记录的组件,常用的appender类有ConsoleAppenderRollingFileAppender,前者个是用来在控制台上打印日志,后者是将日志输出到文件中。
  • layout,是指定日志的布局方式,这个基本都不会去特殊的指定,可以忽略,知道有这个东西即可。
  • encoder,负责把事件转换成字节数组并把字节数组写到合适的输出流。encoder可以指定属性值class,这里对应的类只有一个PatternLayoutEncoder,也是默认值,可以不去指定。
  • filter,过滤器分为三种,logback-classic提供的是两种,分别是常规的过滤器和Turbo过滤器。常用的过滤器就是按照日志级别来控制,将不同级别的日志输出到不同文件中,便于查看日志。如:错误日志输出到xxx-error.log,info日志输出到xxx-info.log中。
  • rollingPolicy,用来设置日志的滚动策略,当达到条件后会自动将条件前的日志生成一个备份日志文件,条件后的日志输出到最新的日志文件中。常用的是按照时间来滚动(使用的类TimeBaseRollingPolicy),还有一种就是基于索引来实现(使用的类FixedWindowRollingPolicy)。
  • triggeringPolicy,日志触发器策略,常用的是日志的大小的控制,当日志达到对应的大小的时候,就会触发。生成新的日志文件。日志大小的控制配合rollingPlicy使用的时候,不同的rollingPolicy会有所不同。

上面就是常用的几个组成部分,下面来各个说明一下。

logback组成部分详解

Appender

定义日志组件:(具体结束看代码注释)

<!-- 
打印在控制台上的日志,日志的encoder是默认的PatternLayoutEncoder,具体的pattern通过标签指定
appender对应的class类型使用的是ConsoleAppender
 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>【logbck】%blue([requestId:%X{requestId:-syslogId}]) %d{yyyy-MM-dd HH:mm:ss.SSS} %red([%thread]) %5level - %msg%n</pattern>
    </encoder>
</appender>
rollingPolicy & triggeringPolicy

rollingPolicy对应是时间滚动策略的日志文件定义:

<!-- 滚动文件的方式生成日志日志文件,文件的存储位置通过file标签指定 -->
<!-- 通过encoder指定日志的生成格式,每个appender的日志格式都可以自定义,不用相同 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/logback/log/test.log</file>
    <encoder>
        <pattern>【logbck】%blue([requestId:%X{requestId:-syslogId}]) %d{yyyy-MM-dd HH:mm:ss.SSS} %red([%thread]) %5level - %msg%n</pattern>
    </encoder>
    <!-- 
    通过rollingPolicy设置日志滚动的策略,这是使用按照时间滚动
    fileNamePattern属性设置滚动生成文件的格式,这里设置的精确到天,也就是按照天滚动,如果时间设置精确到秒,就按秒来滚动
    maxHistory属性设定最大的文件数,比如按天滚动,这里设置了30天,在第31天日志生成的时候,第一天的日志就会被删掉
    -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/logback/log/test-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

说明:fileNamePattern是要格外说明的。如上我设置按天来滚动,前一天日志打印到23点59分,然后就一直没有请求日志,直到次日的1点才有新的日志进入。在0点到1点这个时间段,日志文件是不会滚动生成新的日志文件。因为滚动的动作是需要日志写入动作来触发。

上面是根据时间滚动,下面看一下根据索引滚动。

rollingPolicy对应是索引滚动策略的日志文件定义:

<!-- 设置为按照索引的方式滚动,定义文件名称的时候使用%i作为占位符,滚动后会会用角标替换 -->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <fileNamePattern>/logback/log/test-%i.log</fileNamePattern>
    <minIndex>1</minIndex>
    <maxIndex>3</maxIndex>
</rollingPolicy>
<!-- 指定文件最大尺寸,达到该尺寸,就触发rollingPolicy对应的策略,maxFileSize属性指定文件大小 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <maxFileSize>1MB</maxFileSize>
</triggeringPolicy>

说明:

  • maxIndex不可设置为过大,过大后会自动被置为默认值12,这个过大的值具体是多少没测试过(欢迎小伙伴测试后在文末回复一下,就偷个懒了)。
  • 第一次滚动,生成test-1.log,第二次滚动时会将之前的test-1.log文件修改成test-2.log,将最新生成的日志文件命名为test-1.log,依此类推,指导索引达到设置的最大值。当超过最大值的时候,会将索引最大的文件直接删除,用前一个文件移到最后一位。就像传送带,最先放上的物品会最先掉出传送带。
  • 在时间滚动的方式里面,可以用时间作为触发机制。但是在使用索引方式的时候,需要定义一个triggeringPolicy作为触发机制。

rollingPolicy对应的是时间策略并配合文件大小触发器来实现日志文件定义:

<!-- 使用按照时间滚动策略,内嵌按照文件大小来分隔日志的触发器策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>/logback/log/test-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
    <!-- 使用SizeAndTimeBasedFNATP实现,可以看一下TimeBasedRollingPolicy源码中对应timeBasedFileNamingAndTriggeringPolicy的类型,根据类型确定需要使用的class类 -->
    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>1MB</maxFileSize>
    </timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>

说明:按照时间滚动的单位是天,按照文件大小的滚动是1M,当今天产生的日志大小是5M,就会生成5个日志文件,每个文件对应的大小是1M,对应生成日期是一天,对应的编号不同,也就是%i占位符替换后的编号(从0开始)。

filter

过滤器,根据日志类型将日志输出到不同的日志文件中。文件定义如下:

<!-- info级别日志会输出到test-info.log日志文件中 -->
<appender name="info-log" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/logback/log/test-info.log</file>
    <encoder>
        <pattern>【logbck】%blue([requestId:%X{requestId:-syslogId}]) %d{yyyy-MM-dd HH:mm:ss.SSS} %red([%thread]) %5level - %msg%n</pattern>
    </encoder>
    <!-- filter过滤器,INFO级别 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>
<!-- error级别日志会输出到test-error.log日志文件中 -->
<appender name="info-error" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/logback/log/test-error.log</file>
    <encoder>
        <pattern>【logbck】%blue([requestId:%X{requestId:-syslogId}]) %d{yyyy-MM-dd HH:mm:ss.SSS} %red([%thread]) %5level - %msg%n</pattern>
    </encoder>
    <!-- filter过滤器,ERROR级别 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

不同appender对应不同的日志组件,常规操作,不多说。

总结

其实logback里面的东西还有很多,这里只说基本的操作,在日常开发中很实用的内容。至于源码什么的解析了没什么意思。遇到logback报错能够解决,遇到logback配置报错能够解决,在没有logback模板的情况下,可以徒手写一波就OK啦。

这篇文章说的是主要核心元素,接下来还会写一篇文章,写一下MDC的使用和其他酷炫的操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容