knowing logback

Logback是由log4j创始人Ceki Gülcü设计的又一个开源日志组件。根据logback官网上的说明:

Logback is intended as a successor to the popular log4j project, picking up where log4j leaves off.

logback旨在替代log4j成为最通用的日志框架。相比log4j,Ceki重写了log4j的内核形成了logback,这使得在一些关键执行路径上logback的性能相比log4j提升10倍以上。而且logback的初始化内存加载也更小了。

总所周知slf4j是一个标准的日志接口,而logback则是非常标准的实现。以至于未来替换掉logback非常容易。

这里来看看logback的几个组件。

appender

appender是logback中定义输出位置的组件,它明确了日志输出的位置,是控制台、文件还是数据库等等。

logback中两个最经典的实现就是ConsoleAppenderFileAppender了。除此之外还有很多非常实用的实现,例如:等等。

如果所有现有的实现都不能满足我们的需求也不要紧,logback作为slf4j的实现框架,为我们提供了非常好的扩展。

如果我们需要自己实现一个appender,那么我们就新写一个类,继承AppenderBase就可以了。

public class CountingConsoleAppender extends AppenderBase<ILoggingEvent> {
    public void append(ILoggingEvent event) {
        // export the log to custom place
    }
}

Encoder

appender负责告诉logback把日志送到哪里去,那么怎么显示就需要接下来介绍的一些列组件了,其中Encoder组件负责将日志事件转换成二进制流的形式传递到相应的位置上。

配置中默认使用的Encoder类型是ch.qos.logback.classic.encoder.PatternLayoutEncoder

layout

Encoder负责传递日志流,而layout则负责将一条条日志根据我们的习惯转换成可以阅读的文字。这也是我们在配置logback中最需要自定义的部分了。

最常见的场景就是我们使用ch.qos.logback.classic.PatternLayout这个类了。

平时我们在配置中使用的配置pattern标签使用的就是这个类。

<pattern>
    %d{yyyy-MM-dd HH:mm:ss} |-%-5level ${PID:- } in %-50(%logger[%thread]) : %msg%n
</pattern>

配置中具体的模板转换词可以参考logback的说明http://logback.qos.ch/manual/layouts.html#conversionWord)。

filter

在logback中,我们可以根据自己的需求定制出相对应的规则,过滤掉一些日志,减少排查时候的错误信息。完成这个过滤规则定制的组件就是filter

每个过滤器都会实现一个decide()方法,这个方法会返回一个FilterReply枚举类对象,FilterReply中有DENY,NEUTRAL,ACCEPT三种类型:

  • DENY:日志将立即被抛弃不再经过其他过滤器
  • NEUTRAL:有序列表里的下个过滤器过接着处理日志
  • ACCEPT:日志会被立即处理,不再经过剩余过滤器

filter中最常用的可能就是LevelFilter了。LevelFilter可以帮助过滤指定的日志的等级。

举个栗子,比如我在一个APPENDER组件中放入两个filter

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

这个上面这个配置中,每条日志都会被检查是不是INFO等级的日志,如果是则被接受,如果不是就被丢给下一个filter,第二个filter开始检查是不是ERROR等级,如果等级是日志则被打印,否则日志就被丢弃。

如果我们自己想去实现一个filter,可以定义一个继承ch.qos.logback.classic.filter.Filter的类。在decide()类中去写自己的规则就可以了。

如果我们希望自己定义的filter也能像LevelFilter一样使用onMatchonMismatch两个标签,可以选择继承ch.qos.logback.classic.filter.AbstractMatcherFilter这个类。

Spring Boot和logback

Spring Boot借助成熟的Spring体系,已经在Java生态中大红大紫了,Spring Boot也将logback作为了自己的默认日志处理框架。

一般情况下logback的配置文件会被取成logback.xml,但是Spring Boot中如果需要使用SpringBoot的一些插件,那么需要将插件的配置文件文件名称设置成logback-spring.xml,因为logback.xml加载的时机太早了,以至于Spring还没有启动logback的配置以及完成了。

Spring Boot主要解决的问题就是配置问题,在logback中原先要读取配置是比较麻烦的。

Spring Boot提供了一个插件springProperty:

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
    <remoteHost>${fluentHost}</remoteHost>
    ...
</appender>

这样配置文件会自动从application.properties文件中读取相应的配置,并在logback中使用这些变量。

针对Spring Boot一个jar,四处运行 的宗旨,Spring Boot还提供了一个springProfile的插件:

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev, staging">
    <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
    <!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

这样logback就会根据Spring Boot当时所处的环境,切换到对应的配置上。

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

推荐阅读更多精彩内容