我觉得对于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. Pandas——修改DataFrame列名

    #生成一个数据框 import pandas as pd a = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]}) #直接修改:缺点必须写明每 ...

  2. html二

    超链接 超链接有三种形式: 1.外部链接:链接到外部文件.举例: <a href="new.html">点击进入到新网页</a> a是英语anchor“锚” ...

  3. Error: connection reset by peer ,during filebeat connect to elk.

    Error screenshot like below: Reason: What I found that was the machine failing had same configuratio ...

  4. MobaXterm替换cmder

    Windows上命令行工具cmder确实很好用,其扩展功能呢,比系统自带强大几倍.后来在使用MobaXterm,官网https://mobaxterm.mobatek.net/免费版本功能足够强大,支 ...

  5. Windows自动化---模拟鼠标键盘

    1.PyUserInput(不推荐) python2可以使用PyUserInput库:(不推荐) 支持最基础的鼠标,键盘操作,可以剪贴. 安装的时候:pip install PyUserInput 需 ...

  6. sublime中正则替换

    匹配 <header></header>  ,  “.” 是匹配任意 非 换行 符号 而  \s\S 匹配任何符号 匹配div class为navbar 的 div <d ...

  7. NAS与SAN RAID

    存储区域网络 SAN 存储区域网络(Storage Area Network,简称SAN)采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通道)技术,通过FC ...

  8. python3 continue和break 区别

    for i in range(10): if i==5: continue #跳出当次循环 if i==8: break #跳出整个for循环 print(i)

  9. Wireshark抓取TCP包分析

    介绍 本篇文章是使用wireshrak对某个https请求的tcp包进行分析. 目的 通过抓包实际分析了解tcp包. 准备工作 在我自己机子上安装的是wireshark2.2.6版本,随机查找了某个T ...

  10. python中字典排序,列表中的字典排序

    python中字典排序,列表中的字典排序 一.使用python模块:operator import operator #首先要导入模块operator x = {1:2, 3:4, 4:3, 2:1, ...