详解Springboot之Logback的使用学习

一、导入依赖

普通项目

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.11</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.11</version>
</dependency>

springboot项目

<!--该依赖已经集成了logback-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

二、配置文件解析

Logback默认会到类路径下找logback-test.xml and logback.xml

Spring Boot 会在 classpath 下查找是否有 logback-test.groovy、logback-test.xml、logback.groovy 或者 logback.xml,如果都找不到的话,才会加载项目路径下的 logback-spring.xml

三、配置文件结构

四、各个组件的作用

logger: 日志记录器,root是特殊的logger-顶层logger,因为logger具有继承关系,稍后介绍

appender: 配置日志文件输出目的地

encoder: 控制日志输出格式,它是借助于layout实现的

rollingPolicy: RollingFileAppender具有该子元素,指定发生滚动时的行为

triggeringPolicy: RollingFileAppender具有该子元素,指定何时发生滚动过程,一般不用配置该元素,因为最受欢迎的TimeBasedRollingPolicy ,它实现了rolling policy同时也实现了triggering policy。

filter: 对appender收到的日志进行过滤,只有满足Filter条件的日志才输出到日志文件

五、Logger组件

logger组件具有父子层级关系,root是最顶层的logger。logger记录器是命名实体。它们的名称区分大小写,并且遵循分层命名规则.

如果一个记录器的名称后跟一个点,则该记录器是另一个记录器的祖先,该后跟点的名称是其后代记录器名称的前缀。如果记录器与子记录器之间没有祖先,则称该记录器为子记录器的父项。
例如,名为"com.foo"的记录器是名为"com.foo.Bar"的记录器的父项。同样, "java"是"java.util"和"java.util.Vector"的祖先记录器。大多数开发人员都应该熟悉这种命名方案。

logger日志级别继承

如果未为给定的记录器分配一个级别,则它将从其最接近的祖先那里继承一个已分配的级别。例如:
给定记录器L的有效级别等于其层次结构中的第一个非空级别,从L本身开始, 然后在层次结构中向上寻找直到root logger。为了确保所有记录器最终都可以继承级别,root logger始终具有分配的级别,root logger默认级别是DEBUG。

注意:如果日志记录请求的级别高于或等于记录器的有效级别,则该日志请求是有效的。日志级别按以下顺序排序: TRACE < DEBUG < INFO < WARN < ERROR。

logger关联的appender继承

一个logger可以配置多个appender,logger输出的日志会输出到当前记录器绑定的appender和父级们logger(直到root logger)绑定的appender,可以设置additivity 属性为false,则logger输出的日志仅会输出到当前记录器绑定的appender

六、logger属性

  • name:指定全限定包名
  • level:日志输出级别,如果没有配置,则参考上面的级别继承
  • additivity:默认为true,参考上面的appender继承。

如果additivity为true,会存在重复输出日志情况,如下所示

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <logger name="chapters.configuration">
    <appender-ref ref="STDOUT" />
  </logger>
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

那么chapters.configuration包下的日志会输出两遍到console控制台,如下所示

14:25:36.343 [main] INFO  chapters.configuration.MyApp3 - Entering application.
14:25:36.343 [main] INFO  chapters.configuration.MyApp3 - Entering application.
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] INFO  chapters.configuration.MyApp3 - Exiting application.
14:25:36.359 [main] INFO  chapters.configuration.MyApp3 - Exiting application.

七、Appender组件

配置日志输出的目的地,常用的有ConsoleAppender、FileAppender 、RollingFileAppender

ConsoleAppender

 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!--默认System.out,也可以指定System.error -->
    <target>System.out</target>
    <!-- encoders 默认类型ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>

写日志到标准输出流,可以配置target属性为system.out,也可以指定System.error,默认System.out

FileAppender

包含的子元素有

  • append:如果为true,则追加到已存在的日志文件,否则截断现有文件,默认为true
  • file: 指定日志写入文件的名字。如果文件不存在,则创建包括父级目录。windows系统要避开“\”,正确例子可以指定为c:/temp/test.log或c:\\temp\\test.log
  • encoder: 输出的格式 RollingFileAppender

RollingFileAppender

扩展了FileAppender,具有滚动更新日志文件的功能;例如,RollingFileAppender可以登录到一个名为log.txt的文件,一旦满足某个条件,就可以保存当前日志文件,并滚动输出到新的日志文件。

包含的子元素有

  • append:如果为true,则追加到已存在的日志文件,否则截断现有文件,默认为true
  • file: 指定日志写入文件的名字。如果文件不存在,则创建包括父级目录。windows系统要避开“\”,正确例子可以指定为c:/temp/test.log或c:\\temp\\test.log
  • encoder:输出的格式
  • rollingPolicy: 指定RollingFileAppender发生滚动时的行为
  • triggeringPolicy:指定RollingFileAppender何时发生滚动过程

rollingPolicy

rollingPolicy常用的有TimeBasedRollingPolicy、SizeAndTimeBasedRollingPolicy

TimeBasedRollingPolicy

TimeBasedRollingPolicy是最受欢迎的滚动策略。它基于时间进行滚动,可以是按月或按天等。TimeBasedRollingPolicy承担滚动以及触发所述滚动的责任。它实现了rolling policy同时也实现了triggering policy。
包含的子元素有

  • fileNamePattern:必选;它的值应包括文件名以及适当放置的%d转换说明符。所述 %d由指定的转换说明可包含日期和时间模式 java.text.SimpleDateFormat类。如果省略了日期和时间模式,则采用默认模式 yyyy-MM-dd;可以指定多个%d,但是只有一个主要的,其他的都要使用‘aux'标记,多个%d允许你组织对日志文件归类,例如按照年月分文件夹/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log
  • maxHistory:设置存档文件保存时间,日志文件至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。
  • totalSizeCap:控制归档文件的大小

SizeAndTimeBasedRollingPolicy

支持按照时间拆分后,再按文件大小拆分

<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 			20GB -->
       <maxFileSize>100MB</maxFileSize>
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
</appender>

"%i"表示当日志文件达到“maxFileSize”它将按照递增序列(以0开始)归档日志。

triggering policy

SizeBasedTriggeringPolicy

该triggering policy通过配置一个maxFileSize参数,当日志文件超过该阈值,会通知RollingFileAppender 触发日志翻滚。但一般triggering policy可以不用配置,TimeBasedRollingPolicy 已经完美集成了。

补充:以上Appender都是本地记录日志,logback也支持网络输出日志、本地数据、邮件等;后续如果有需要再来研究。logback还可以使用AsyncAppender异步记录日志。

Encoder

encoder负责转换事件为字节数组并将字节数组写入输出流中。PatternLayoutEncoder 是最常用的encoder,该类通过使用PatternLayout来格式化日志事件。我们可以直接配置PatternLayoutEncoder ,而不用配置PatternLayout,它默认使用PatternLayout进行格式输出。

layout

负责转换事件成字符串,我们可以自定义layout,然后通过encoder引用

 <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="chapters.layouts.MySampleLayout" />
    </encoder>

PatternLayout

它将日志事件转换成字符串,但是可以自定义字符串通过调整PatternLayout的转换模式。

PatternLayout的转换模式跟C语言的printf()函数紧密相关。
常用的模式有:

% d{pattern}: 日期

% level 日志级别

%thread 线程名称

%class 全限定类名,日志请求记录所在的类

%method 日志请求记录所在的方法

%line 日志请求记录的行号

%n 换行

%logger{length} 输出日志logger记录器的名字,length指定输出名字长度,logback会智能缩写而不丢失语义。

%msg 输出日志记录器记录的消息

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS,CTT} %-5level [%thread] [%class:%line] %logger{50} - %msg%n</pattern>
</encoder>

多个模式之间分隔符,在大多数情况下,文字需包含空格或其他分隔字符('[',']','-'),这样就不会与转换词混淆

Filter

对appender收到的日志调用decide方法进行过滤,只有满足Filter条件的日志才输出到日志文件,decide方法有三个返回值,DENY、ACCEPT、NEUTRAL

  • 如果返回的值为DENY,则立即删除日志事件,而不咨询其余的筛选器;
  • 如果返回的值是NEUTRAL中性的,则查询列表中的下一个筛选器,如果没有其他筛选器可供查询,则日志事件将正常处理;
  • 如果返回值为ACCEPT,则会立即处理日志事件,跳过其余筛选器的调用。

LevelFilter

该过滤器对日志的级别过滤,如果事件日志级别等于配置的级别,过滤器接受或者拒绝该事件日志,依赖于onMatch 和 onMismatch属性

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level %logger{30} - %msg%n
      </pattern>
    </encoder>
</appender>

ThresholdFilter

过滤低于指定阈值的事件。对于等于或高于阈值的事件,将在调用其()方法时响应NEUTRAL 。但是,级别低于阈值的事件将被拒绝。

 <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>

EvaluatorFilter

EvaluatorFilter 是封装了的通用过滤器 EventEvaluator。顾名思义, 评估对象是否满足给定事件的给定条件。在匹配和不匹配时,托管将分别返回由onMatch 或onMismatch属性指定的值。
GEventEvaluator 实现了EventEvaluator,通过子元素采用任意Groovy语言布尔表达式作为评估标准的具体实现
JaninoEventEvaluator实现了EventEvaluator,通过子元素采用任意Java语言块返回布尔值作为评估标准。

uatorFilter

EvaluatorFilter 是封装了的通用过滤器 EventEvaluator。顾名思义, 评估对象是否满足给定事件的给定条件。在匹配和不匹配时,托管将分别返回由onMatch 或onMismatch属性指定的值。
GEventEvaluator 实现了EventEvaluator,通过子元素采用任意Groovy语言布尔表达式作为评估标准的具体实现
JaninoEventEvaluator实现了EventEvaluator,通过子元素采用任意Java语言块返回布尔值作为评估标准。

EvaluatorFilter 也可通过子元素支持正则匹配。

到此这篇关于详解Springboot之Logback的使用学习的文章就介绍到这了,更多相关Logback详解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • spring boot使用logback日志级别打印控制操作

    因为公司业务需要,需要把性能日志和业务日志分开打印,用elk收集处理,所以需要对不同的业务的日志,打印到不同文件. 使用的是spring boot自带的logback. 首先在yml文件配置logback.xml文件,默认会从resources下找logback.xml文件,找不到会从yml文件中找logging.config下的指定文件. logging: level: DEBUG config: classpath:logback.xml logback.xml是logback的配置文件,可

  • logback使用filter过滤日志操作

    笔者语录: 我发现我喜欢捣鼓一些小玩意儿,虽然官网(见文末)写得很明白了,但是咱们对感兴趣的部分来敲一遍代码好吧. 过滤器简介: 简介 logback具有过滤器支持.logbcak允许给日志记录器appender配置一个或多个Filter(或者给整体配置一个或多个TurboFilter),来控制:当满足过滤器指定的条件时,才记录日志(或不满足条件时,拒绝记录日志).logback支持自定义过滤器,当然logback也自带了一些常用的过滤器,在绝大多数时候,自带的过滤器其实就够用了,一般是不需要自

  • springboot项目配置logback日志系统的实现

    记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <

  • 解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题

    application.properties 加入以下配置 #logback home logging.path=D:/logs/esb-producer logback.xml <property name="LOG_PATH" value="${LOG_PATH:- }" /> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.Rolling

  • Logback的使用及如何配置

    日志在项目开发过程的作用不言而喻,项目上线后,我们需要根据日志文件定位问题发生的位置以及产生的原因.以前在项目开发中,已经有前人在工程中配置过日志,所以完全不需要自己再进行日志的配置.这次在新的项目中自己来配置日志时,还是遇到了一些波折,下面慢慢道来. 1 为什么选用Logback? 目前,在Springboot工程体系中,使用较多的日志组件是Slf4j.Logback以及Log4j2.而Slf4j本身只是一个接口类,具体的实现还是由Logback或Log4j2来完成的.由于Springboot

  • 使用Logback日志保存到相对路径的操作

    说明 在使用Logback中需要保存输出日志,但是却在保存的时候路径出现问题 项目背景 1.Win7 2.Java Web + Tomcat 7.0(在D盘目录下) 3.Logback 1.1.7 案例一 Logback.xml文件配置 <!-- 路径名称 --> <property name="log.base" value="logs" /> <!-- 保存的文件名 --> <property name="lo

  • 利用logback 设置不同包下的日志级别

    1.实现效果:项目的整体的日志打印级别为ERROR,但在某个包下或某个类想打印INFO级别的日志. 2.配置: FILE是ERROR级别日志打印: SPECIAL 是INFO级别日志打印: FILE与SPECIAL唯一不同是日志保存路径不同,其它策略相同: 通过 logger标签指定包路径或类路径并引用SPECIAL: <?xml version="1.0" encoding="UTF-8"?> <configuration> <con

  • springboot使用Logback把日志输出到控制台或输出到文件

    一:日志: 1.配置日志级别 日志记录器(Logger)的行为是分等级的.如下表所示: 分为:OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL 默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别 设置日志级别 logging.level.root=WARN 这种方式只能将日志打印在控制台上 二.Logback日志 spring boot内部使用Logback作为日志实现的框架. Logback和log4j非常相似,如果你对l

  • logback.xml动态配置程序路径的操作

    1.普通java程序 如下配置的logback.xml <?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOGS_HOME" value="/opt/program/app/logback-demo/logs"/> <!-- 该值由启动程序时候动态传入 --> <property

  • 使用logback屏蔽一些包的日志

    在logback.xml中加上该配置,包名如:com.xxx <logger name="packageName" level="OFF"> </logger> 补充知识:logback,利用java包名对包内所有类定义输出形式 目的 将java package 中的所有类定义一个输出logger,定义它的级别,这样就不用每个类都配置. 测试 配置文件 <?xml version="1.0" encoding=&qu

  • springcloud LogBack日志使用详解

    <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> 引入lombok即可,lombok包含了Slf4j 下面只需在resources目录下引入此xml配置即可 <?xml version="1.0" encoding="UTF-8"?> <

  • Java logback日志的简单使用

    说明 logback作为log4j的替代,有很多优势.要将logback应用到项目中,步骤很简单.加入依赖的jar包和配置文件即可. logback.xml中主要元素: <property> 定义属性,定义之后,后文可以通过该变量引用. <appender> 定义日志输出格式.位置.文件分割等.被<logger>或<root>引用. <logger> 定义日志名称及对应的级别.name可以是包名.类名或者单纯的字符串.如果是包名或者类名,那么该包

  • logback关闭某个包的日志操作

    最近想关闭一个包的日志打印,经过一番研究实际上就一句话的事, 一直没成功是因为name写错了. <logger name="packname" level="OFF"> </logger> packname一般是包名,但也可能是其他的名字,这个取决于java代码中写的名字 static final Logger log=LoggerFactory.getLogger("name"); 补充知识:Log4j和logback冲

  • 解决logback的日志文件路径问题

    假如使用绝对路径,没有任何问题,就是移植性不太好. 假如使用相对路径,则要注意当前路径"."是在哪儿? 一般我们都会在配置文件中加入log文件的存储目录,如 本人通过研究测试发现: 1.对于J2SE项目,当前路径为工程所在目录 如我的工程为:D:\test 则使用-/logs生成的日志文件位于:D:\logs 2.对于J2EE项目,当前路径为tomcat\bin所在目录 如我的tomcat路径为:D:\tomcat\bin 则使用-/logs生成的日志文件位于:D:\tomcat\lo

  • 项目为什么引入log4j而不是logback代码

    什么是slf4j SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志System. 为什么使用slf4j 上面已经介绍了slf4j,那么至于为什么使用它.Slf4j可以看成是接口,那么既然是接口,实现在哪里呢?实现就是基于你自己的系统需要引入什么日志.我这里使用了log4j作为slf4j的实现.

  • 如何修改logback.xml配置文件在resource以外的位置

    因为spring搭建的web项目打包时默认将resource文件夹下的文件一起打包,但是我们又想在打包后修改某些配置 这里以我遇到的logback.xml配置更改默认路径来看 根据LoggerFactory.getLogger的方法找到加载文件的位置,如下 public URL findURLOfDefaultConfigurationFile(boolean updateStatus) { ClassLoader myClassLoader = Loader.getClassLoaderOfO

  • springboot logback调整mybatis日志级别无效的解决

    现象 在日志配置文件 logback-spring.xml 中,无论怎么修改级别,mybatis 的 sql 日志都会打印出来. 原因 在 application.yml 中配置了 mybatis 的自定义日志类,如下: mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 点进去查看源码,发现 debug 日志级别始终为 true,所以怎么配置都不生效 public boolean isDeb

  • Logback日志存放路径不统一解决方案

    问题: 将一个应用程序打成了Jar包后,使用命令运行jar包,发现日志存放的路径并不统一: 比如 hello.jar 包放在 /aaa/bbb 目录下 如果在 /aaa/bbb 目录下执行:java -jar hello.jar ,那么日志就会存放在 /aaa/bbb 目录下 如果在 /aaa 目录下执行:java -jar bbb/hello.jar ,那么日志就会存放在 /aaa 目录下 如何才能不同位置执行jar包,但是日志放到一个统一的目录中呢? 解决过程: 查看logback.xml中

随机推荐