我觉得对于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. 关于在多个UItextield切换焦点

    本人对于应用的完美用户体验是这样认为:当一个应用是迎合用户习惯 ,并且在人机交互之中降低用户的学习成本 ,由于应用和人的思维方向一致时,就会有共鸣,这对于程序设计是有益的,因为只要愿意去改变总有优雅的 ...

  2. TensorFlow车辆检测

    1.先在UIUC Image Database for Car Detection下载训练数据集. 下载地址:http://cogcomp.org/Data/Car/ 下载解压之后文件目录如图所示,这 ...

  3. ArcGIS api for javascript-图层控制(图层树)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. oracle随笔

    Oracle新建数据库(新用户) 1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 passwo ...

  5. 直播点赞,上升的动画-- CAKeyFrameAnimation

    // //  ViewController.m //  DMHeartFlyAnimation // //  Created by Rick on 16/3/9. //  Copyright © 20 ...

  6. Unity 关节

    引言 关节组件一共分为5大类,它们分别是链条关节.固定关节.弹簧关节.角色关节和可配置关节. 链条关节(Hinge Joint):将两个物体以链条的形式绑在一起,当力量过大超过链条的固定力矩时,两个物 ...

  7. 【笔记】Pandas分类数据详解

    [笔记]Pandas分类数据详解 Pandas  Pandas分类数据详解|轻松玩转Pandas(5) 参考:Pandas分类数据详解|轻松玩转Pandas(5)

  8. Educational Codeforces Round 7 B

    Description You are given the current time in 24-hour format hh:mm. Find and print the time after a  ...

  9. Flask&&人工智能AI -- 8 HTML5+ 初识,HBuilder,夜神模拟器,Webview

    昨日内容回顾 1.增删改查: 增: db.collections.insert({a:1}) // 官方不推荐了 db.collections.insertMany([{a:1},{b:1}]) in ...

  10. 关于pycharm使用sqlite数据可视化的使用

    如图