logback配置说明
我觉得对于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配置说明的更多相关文章
- 一秒完成springboot与logback配置
1. 一秒配置与效果 1.1 一秒配置 spring boot中无须添加任何依赖,直接在resources文件夹下面新建logback.xml文件,将以下代码复制过去,配置完成,可以使用了. &l ...
- springboot项目配置logback日志系统
记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: < ...
- Logback 入门和配置说明
Logback 是 Log4j 的改进版本,而且原生支持 SLF4J,Logback 的初始化步骤如下: 在类路径中查找 logback-test.xml 配置文件 在类路径中查找 logback.g ...
- Spring Boot Logback应用日志
e Spring Boot Logback应用日志 2015-09-08 19:57 7673人阅读 评论(0) 收藏 举报 . 分类: Spring Boot(51) . 目录(?)[+] 日志对于 ...
- Logback日志配置的简单使用
Logback介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-access ...
- spring boot下使用logback或log4j生成符合Logstash标准的JSON格式
spring boot下使用logback或log4j生成符合Logstash标准的JSON格式 一.依赖 由于配置中使用了json格式的日志输出,所以需要引入如下依赖 "net.logst ...
- spring-boot整合mybatis(web mysql logback配置)
pom.xml相关的配置说明. 配置文件看着比价多,在创建spring-boot项目的时候,自需要添加web,mysql,mybatis三个选项即可 <?xml version="1. ...
- logback多环境配置
现在项目基本都是要区分测试开发等等一系列环境的,也因此maven,spring之类的都具有profile这类功能,可以针对不同的环境采用不同的配置.因此日志也可能根据不同的环境需要不同的配置.恰巧手头 ...
- manven springmvc 项目中 slf4j 的配置使用(结合log4j 或者 logback)
前言:每个maven springmvc 都应该有日志功能,SLF4J(Simple logging facade for Java)就是一种日志规范,它提供了一个共通接口,可以适配多种不同的LOG实 ...
随机推荐
- 关于在多个UItextield切换焦点
本人对于应用的完美用户体验是这样认为:当一个应用是迎合用户习惯 ,并且在人机交互之中降低用户的学习成本 ,由于应用和人的思维方向一致时,就会有共鸣,这对于程序设计是有益的,因为只要愿意去改变总有优雅的 ...
- TensorFlow车辆检测
1.先在UIUC Image Database for Car Detection下载训练数据集. 下载地址:http://cogcomp.org/Data/Car/ 下载解压之后文件目录如图所示,这 ...
- ArcGIS api for javascript-图层控制(图层树)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- oracle随笔
Oracle新建数据库(新用户) 1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 passwo ...
- 直播点赞,上升的动画-- CAKeyFrameAnimation
// // ViewController.m // DMHeartFlyAnimation // // Created by Rick on 16/3/9. // Copyright © 20 ...
- Unity 关节
引言 关节组件一共分为5大类,它们分别是链条关节.固定关节.弹簧关节.角色关节和可配置关节. 链条关节(Hinge Joint):将两个物体以链条的形式绑在一起,当力量过大超过链条的固定力矩时,两个物 ...
- 【笔记】Pandas分类数据详解
[笔记]Pandas分类数据详解 Pandas Pandas分类数据详解|轻松玩转Pandas(5) 参考:Pandas分类数据详解|轻松玩转Pandas(5)
- 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 ...
- Flask&&人工智能AI -- 8 HTML5+ 初识,HBuilder,夜神模拟器,Webview
昨日内容回顾 1.增删改查: 增: db.collections.insert({a:1}) // 官方不推荐了 db.collections.insertMany([{a:1},{b:1}]) in ...
- 关于pycharm使用sqlite数据可视化的使用
如图