我觉得对于logback大家不太明白的有:过滤器、logger和root以及其中的一些属性的关系。其他的应该不是多迷糊,所以我就主要说说这几个的关系,并且为了清晰我只说控制台日志,写到文件的日志配置大同小异!

提前声明:最终打印的日志的级别是和过滤器、root、logger三者都相关的。

一、过滤器

过滤器可以在一个appender中设置多个,并且会从上到下依次过滤

1.LevelFilter

这个过滤器的作用是:过滤日志的级别,并且可以配合三个标签使用<level>、<onMatch>、<onMismatch>

<level>:设置你想要的级别,大小写无所谓(在一个地方看到一种写法<level>INFO,DEBUG</level>,然而我测试时没发现这种写法有什么作用,他还是按照info的级别没有debug,root中写的是debug)

<onMatch>:设置日志级别匹配时的操作,有三个选择:ACCEPT、DENY、NEUTRAL。

  ACCEPT:接收属于设置的级别的日志

  DENY:拒绝设置的级别的日志

  NEUTRAL:对设置的级别的日志不作处理,如果有多个过滤器,会交给下一个过滤器进行过滤操作。

<onMismatch>:设置日志级别不匹配时的操作,三个选择同上

  ACCEPT:不匹配时接收

  DENY:不匹配时拒绝

  NEUTRAL:不匹配时不作处理,交给下个过滤器。

  

    <!--控制台日志-->
<appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</layout>
</appender>

2.ThresholdFilter

这个过滤器作用是:过滤掉低于设置的等级的日志,只保留所有高于设置的等级的日志。如下:假设忽略root或logger中设置的等级,则只会在控制台输出warn、error级别的日志。

    <!--控制台日志-->
<appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</layout>
</appender>

3.自定义过滤器

比如我的业务场景是:我要在mdc中放值然后在logback中取值,如果某个值取不到就不打印日志。

1.先写主要过滤逻辑

package com.filter;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import org.springframework.util.StringUtils; public class SimpleLogFilter extends Filter<ILoggingEvent> { @Override
public FilterReply decide(ILoggingEvent event) {//通过event可以取到几乎日志的所有字段,或者判断日志中是否包含指定的文字信息,这个需要自己去写逻辑。
if (StringUtils.isEmpty(event.getMDCPropertyMap().get("name"))) {
return FilterReply.DENY;//deny则是拒绝,也即如果我在mdc中不能取到name这个字段对应的信息,就不打印日志。
} else {
return FilterReply.NEUTRAL;//交给下个过滤器处理,本自定义过滤器不处理。
}
}
}

2.在logback中添加我们自己写的过滤器,class中对应以上类的全限定名。这样即可过滤所有%X{name}取不到值的情况。

<!--控制台日志-->
<appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
<filter class="com.filter.SimpleLogFilter"/>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%X{name} %X{age} %X{like}-----%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n</pattern>
     </layout>
   </appender>

3.测试的controller,你会发现当你调用test1时不会打印日志,调用test2时才会打印日志。

package com.controller;

import com.pojo.JsonData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping(path = "/api/log/")
public class LoggerController {
Logger logger= LoggerFactory.getLogger(getClass()); @RequestMapping(path = "test1")
public Object logTest1(){
logger.trace("-----trace级别日志-----");
logger.debug("-----debug级别日志-----");
logger.info("-----info级别日志-----");
logger.warn("-----warn级别日志-----");
logger.error("-----error级别日志-----");
return JsonData.buildSuccess();
} @RequestMapping(path = "test2")
public Object logTest2(){
MDC.put("name","yangche");
MDC.put("age","25");
MDC.put("like","wujing");
logger.trace("-----trace级别日志-----");
logger.debug("-----debug级别日志-----");
logger.info("-----info级别日志-----");
logger.warn("-----warn级别日志-----");
logger.error("-----error级别日志-----");
logger.info("");
MDC.clear();
return JsonData.buildSuccess();
}
}

4.EvaluatorFilter过滤器

<!--控制台日志-->
<appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> <!-- 默认为 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>
if(mdc.get("name")==null){
return false;
}
return true;
</expression>
</evaluator>
<OnMatch>ACCEPT </OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%X{name} %X{age} %X{like} %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</layout>
</appender>

这个过滤器简单说就是可以在xml中写java代码,对日志中的信息,mdc中的信息等等进行任何你想要的过滤,类似上面的自定义过滤器,只不过这个是写在xml中,注意这个不会像在java中可以随心所欲的导包,所以写起来需要更加注意。

并且,想用这个过滤器需要单独导入一个jar包,如下,否则你的项目应该是启动不了的,需要特别注意一下:

<!-- logback使用条件过滤器时需要的包 -->
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.janino</artifactId>
<version>2.6.1_1</version>
</dependency>

二、logger和root以及其中的一些属性的关系(此处假设没有设置过滤器)

<!--控制台日志-->
<appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</layout>
</appender>
<logger name="com.controller.LoggerController" additivity="false">
<appender-ref ref="consoleApp" />
</logger> <!--root level最低级别-->
<root level="debug">
<appender-ref ref="consoleApp"/>
<appender-ref ref="fileInfoApp"/>
<appender-ref ref="fileErrorApp"/>
  <root/>

1、logger的name属性配置的是打印某一个类,或某一个包的日志信息,additivity作用是是否相加到父,也就是如果你在logger配置了appender又在root中配置了相同的appender,设置为true会看到控制台打印了两遍日志,如果设置为false则只打印一次root中的相同appender不生效。

logger中的属性说明:

  name:配置的是打印某一个类,或某一个包的日志信息

  additivity:是否相加到父,也就是如果你在logger配置了appender又在root中配置了相同的appender,设置为true会看到控制台打印了两遍日志,如果设置为false则只打印一次root中的相同appender不生效。默认为true。

  level:设置一个打印的最低级别,如果你设置的是debug,则appender中会收到debug、info、warn、error,然后有过滤器会再对这些级别进行过滤。如果你设置为warn,则appender中只能收到warn、error级别的日志,然后过滤器只能对这两个级别的日志进行过滤。

root中的属性说明:

  level:也是设置一个最低的打印级别,appender收到的日志级别只能是大于等于这个设定级别的日志。

logback配置说明的更多相关文章

  1. 一秒完成springboot与logback配置

    1. 一秒配置与效果 1.1 一秒配置 ​ spring boot中无须添加任何依赖,直接在resources文件夹下面新建logback.xml文件,将以下代码复制过去,配置完成,可以使用了. &l ...

  2. springboot项目配置logback日志系统

    记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: < ...

  3. Logback 入门和配置说明

    Logback 是 Log4j 的改进版本,而且原生支持 SLF4J,Logback 的初始化步骤如下: 在类路径中查找 logback-test.xml 配置文件 在类路径中查找 logback.g ...

  4. Spring Boot Logback应用日志

    e Spring Boot Logback应用日志 2015-09-08 19:57 7673人阅读 评论(0) 收藏 举报 . 分类: Spring Boot(51) . 目录(?)[+] 日志对于 ...

  5. Logback日志配置的简单使用

    Logback介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-access ...

  6. spring boot下使用logback或log4j生成符合Logstash标准的JSON格式

    spring boot下使用logback或log4j生成符合Logstash标准的JSON格式 一.依赖 由于配置中使用了json格式的日志输出,所以需要引入如下依赖 "net.logst ...

  7. spring-boot整合mybatis(web mysql logback配置)

    pom.xml相关的配置说明. 配置文件看着比价多,在创建spring-boot项目的时候,自需要添加web,mysql,mybatis三个选项即可 <?xml version="1. ...

  8. logback多环境配置

    现在项目基本都是要区分测试开发等等一系列环境的,也因此maven,spring之类的都具有profile这类功能,可以针对不同的环境采用不同的配置.因此日志也可能根据不同的环境需要不同的配置.恰巧手头 ...

  9. manven springmvc 项目中 slf4j 的配置使用(结合log4j 或者 logback)

    前言:每个maven springmvc 都应该有日志功能,SLF4J(Simple logging facade for Java)就是一种日志规范,它提供了一个共通接口,可以适配多种不同的LOG实 ...

随机推荐

  1. go语言实战教程之 后台管理页面统计功能开发(1)

    本节内容我们将学习开发实现后台管理平台页面统计功能开发的功能接口,本章节内容将涉及到多种请求路由的方式. 功能介绍 后台管理平台不仅是功能管理平台,同时还是数据管理平台.从数据管理平台角度来说,在管理 ...

  2. JavaScript之入门篇(二)

    终于学到后面的语法部分了,感觉这门语言基础部分和当初学习VB的时候感觉一样一样的,章节目录让我不禁又想到了VB课本.由于怕学过了,过段时间忘了,于是,大概总结一下. 数据类型部分 ① Typeof操作 ...

  3. 深入理解sudo

    [root@cairui ~]# cat /etc/sudoers ## Sudoers allows particular users to run various commands as ## t ...

  4. JBOSS在win7环境下启动run.bat无反应

    今天从隔壁机器拷贝了一份Jboss,却发现启动无任何反应. 仔细对比了jdk jboss的各项参数发现都是相同,无奈之下,检查run.bat文件 发现时在此句出现前后 无反应: "%JAVA ...

  5. git相关问题处理

    1.在git push时无法提交代码,相对于git服务器上,本身代码可能不是最新的,因此提交的时候会报以下这个错误 Updates were rejected because the tip of y ...

  6. 「BZOJ3065」带插入区间第K小值 替罪羊树×线段树

    题目描述 从前有\(n\)只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力\(a_i\).跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间\(k\)小值.他 ...

  7. EF core 学习 执行原生sql语句 之ExecuteReader 和ExecuteScalar

    通过ef core 源码分析 Microsoft.EntityFrameworkCore.Storage.RelationalCommandExtensions类中有相应的方法 为此得到相应的结果: ...

  8. CF580B Kefa and Company 尺取法

    Kefa wants to celebrate his first big salary by going to restaurant. However, he needs company. Kefa ...

  9. zabbix监控tcp连接数的脚本!!

    #!/bin/bash #this script is used to get tcp and udp connetion status #tcp status metric=$ tmp_file=/ ...

  10. Java Applet 素数小程序

    en... 1. Applet 这个远古的东西,今天我同学让我帮他看看代码,说applet运行出错.额,反正闲着也是闲着,看看呗 ,结果看到代码...4 2.就是实现这破玩意 package calc ...