logback加载顺序

我们简单分析一下logback加载过程,当我们使用logback-classic.jar时,应用启动,那么logback会按照如下顺序进行扫描:
在classpath下寻找是否有logback.groovy(即logback支持groovy与xml两种配置方式)
在classpath下寻找是否有logback-test.xml
在classpath下寻找是否有logback.xml

以上任何一项找到了,就不进行后续扫描

当所有以上四项都找不到的情况下,logback会构造一个ConsoleAppender用于向控制台输出日志,默认日志输出格式为"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"。

Logback的层级说明

configuration  rootlogger                     property                        appender layout rollingPolicyPatternfileNamePatternmaxFileSizemaxHistorytotalSizeCap

configuration 根节点

一般有三个属性,分别是scan、scanPeriod和debug。

scan:是否自动加载,默认为true。
scanPeriod:监听修改时间间隔,默认一分钟。
debug: 是否查看logback运行状态,默认true。

那么我们要使用这个的话,可以进行如下配置:

<configuration  scan="true" scanPeriod="30 seconds" debug="true">
...
</configuration>

root 和logger 子节点,用于指定输入的日志级别。

<logger:用来设置某一个包或者具体某一个类的日志打印级别、以及指定<appender。<logger可以包含零个或者多个<appender-ref元素,标识这个appender将会添加到这个logger。<logger仅有一个name属性、一个可选的level属性和一个可选的additivity属性:
name:用来指定受此logger约束的某一个包或者具体的某一个类
level:用来设置打印级别,五个常用打印级别从低至高依次为TRACE、DEBUG、INFO、WARN、ERROR,如果未设置此级别,那么当前logger会继承上级的级别
additivity:是否向上级logger传递打印信息,没有配置additivity,那么additivity=true,表示此的打印信息向父级传递,也就是该logger控制的日志如果自己不输出(没有配置<appender-ref 就是输出日志),交由父目录root输出。如果自己有输出,logger控制的输出部分,root就不会输出。

没有配置<appender-ref,表示此<logger不会打印出任何信息

<root也是<logger元素,但是它是根logger,只有一个level属性,因为它的name就是ROOT

例如:

private static Logger LOG2 = LoggerFactory.getLogger("oneInfo");

他们的用法如下:

<logger name="oneInfo" level="DEBUG" additivity="false"><appender-ref ref="ONE_INFO" />
</logger>
<root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="FILE" />
</root>

或者name指定一个包

<logger name="com.yss.henghe.platform.analy.dao" level="DEBUG" additivity="false"><appender-ref ref="CONSOLE"/></logger>

property 子节点

一般用来定义变量值。有两个属性name和value。类似Java中Map的key和value。

name: 变量的名称
value: 变量的值

用法如下:

<property name="LOG_HOME" value="logs/pcm"/>

说明:value指定的文件路径,会在项目同级目录下自动生成,无需手动创建。

logback-spring.xml读取application.properties配置文件中的elk.logger.destination

解决方案:需要通过springProperty标签来引用:<springProperty scope="context" name="elkLoggerUrl" source="elk.logger.destination"/>
<appender name="logstash"class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>${elkLoggerUrl}</destination>

appender 子节点,负责写日志的组件。有两个属性,name和class。

name: 自定义名称。
class:对应自定义名称的全路径名,就是使用何种方式进行日志的输出。

这个非常重要,也可以说是logback的核心吧。简单的用法如下:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
</appender>

说明:定义一个STDOUT名称,在控制台进行输出。

encoder和Pattern 这两个一般是一起使用的。

简单的用法如下:

<encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>

说明:Pattern里面格式的%d表示输出的时间格式,%thread 表示输出的线程名称,%-5level 表示字符宽度,%msg 表示输出的信息,%n表示换行。

rollingPolicy、fileNamePattern、maxFileSize、 maxHistory和totalSizeCap 这些一般用于对日志进行滚动,也就是日志切割管理之类的。

rollingPolicy: 决定日志滚动行为,一般用于日志切割。
fileNamePattern:必要的节点,一般用于指定日志的文件的路径以及生成格式。
maxFileSize:单个日志文件最大值,达到之后就进行切割。
maxHistory:日志文件最多保留的天数,也就是过期时间。
totalSizeCap : 日志文件总体的最大值,达到之后就不再产生日志。

简单的用法如下:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern><maxFileSize>10MB</maxFileSize><maxHistory>31</maxHistory><totalSizeCap>10GB</totalSizeCap></rollingPolicy></appender>

说明:这段的配置意义是,每天产生一个日志文件,如果超出了10M,日志就进行切割,并且在日志文件名称上加一,日志文件最多保持31天,日志文件总共最大为10G。
这里需要注意日志文件中的%d、%i是不可或缺的,如果是换成小时,定时删除是不起作用的,这也是logback的一个bug

ConsoleAppender

ConsoleAppender的作用是将日志输出到控制台,配置示例为:

1 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
2     <encoder>
3         <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
4     </encoder>
5 </appender>

FileAppender

FileAppender的作用是将日志写到文件中,配置示例为:

1 <appender name="FILE" class="ch.qos.logback.core.FileAppender">
2     <file>D:/123.log</file>
3     <append>true</append>
4     <encoder>
5         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
6     </encoder>
7 </appender>

它的几个节点为:

<file>表示写入的文件名,可以使相对目录也可以是绝对目录,如果上级目录不存在则自动创建
<appender>如果为true表示日志被追加到文件结尾,如果是false表示清空文件
<encoder>表示输出格式,后面说
<prudent>如果为true表示日志会被安全地写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认为false

RollingFileAppender

RollingFileAppender的作用是滚动记录文件,先将日志记录到指定文件,当符合某个条件时再将日志记录到其他文件,RollingFileAppender配置比较灵活,因此使用得更多,示例为:

1 <appender name="ROLLING-FILE-1" class="ch.qos.logback.core.rolling.RollingFileAppender">
2     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
3         <fileNamePattern>rolling-file-%d{yyyy-MM-dd}.log</fileNamePattern>
4         <maxHistory>30</maxHistory>
5     </rollingPolicy>
6     <encoder>
7         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
8     </encoder>
9 </appender>
<fileNamePattern>,必要节点,包含文件名及"%d"转换符,"%d"可以包含一个Java.text.SimpleDateFormat指定的时间格式,如%d{yyyy-MM},如果直接使用%d那么格式为yyyy-MM-dd。RollingFileAppender的file子节点可有可无,通过设置file可以为活动文件和归档文件指定不同的位置
<maxHistory>,可选节点,控制保留的归档文件的最大数量,如果超出数量就删除旧文件,假设设置每个月滚动且<maxHistory>是6,则只保存最近6个月的文件

异步写日志

日志通常来说都以文件形式记录到磁盘,例如使用,这样的话一次写日志就会发生一次磁盘IO,这对于性能是一种损耗,因此更多的,对于每次请求必打的日志(例如请求日志,记录请求API、参数、请求时间),我们会采取异步写日志的方式而不让此次写日志发生磁盘IO,阻塞线程从而造成不必要的性能损耗。

1 <?xml version="1.0" encoding="UTF-8" ?>2 <configuration scan="false" scanPeriod="60000" debug="false">3 4     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">5         <encoder>6             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>7         </encoder>8     </appender>9
10     <appender name="ROLLING-FILE-1" class="ch.qos.logback.core.rolling.RollingFileAppender">
11         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
12               <fileNamePattern>D:/rolling-file-%d{yyyy-MM-dd}.log</fileNamePattern>
13               <maxHistory>30</maxHistory>
14         </rollingPolicy>
15         <encoder>
16               <pattern>%-4relative [%thread] %-5level %lo{35} - %msg%n</pattern>
17         </encoder>
18     </appender>
19
20     <!-- 异步输出 -->
21     <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
22         <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
23         <discardingThreshold>0</discardingThreshold>
24         <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
25         <queueSize>256</queueSize>
26         <!-- 添加附加的appender,最多只能添加一个 -->
27         <appender-ref ref ="ROLLING-FILE-1"/>
28     </appender>
29
30     <logger name="java" additivity="false" />
31     <logger name="java.lang" level="DEBUG">
32         <appender-ref ref="ASYNC" />
33     </logger>
34
35     <root level="INFO">
36         <appender-ref ref="STDOUT" />
37     </root>
38
39 </configuration>
discardingThreshold,假如等于20则表示,表示当还剩20%容量时,将丢弃TRACE、DEBUG、INFO级别的Event,只保留WARN与ERROR级别的Event,为了保留所有的events,可以将这个值设置为0,默认值为queueSize/5
queueSize比较好理解,BlockingQueue的最大容量,默认为256
includeCallerData表示是否提取调用者数据,这个值被设置为true的代价是相当昂贵的,为了提升性能,默认当event被加入BlockingQueue时,event关联的调用者数据不会被提取,只有线程名这些比较简单的数据。通常不去设置。
appender-ref表示AsyncAppender使用哪个具体的<appender>进行日志输出

Filter

最后来看一下,是的一个子节点,表示在当前给到的日志级别下再进行一次过滤,最基本的Filter有ch.qos.logback.classic.filter.LevelFilter和ch.qos.logback.classic.filter.ThresholdFilter。
首先看一下LevelFilter:

 1 <configuration scan="false" scanPeriod="60000" debug="false">2 3     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">4         <encoder>5             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>6         </encoder>7         <filter class="ch.qos.logback.classic.filter.LevelFilter">8             <level>WARN</level>9             <onMatch>ACCEPT</onMatch>
10             <onMismatch>DENY</onMismatch>
11         </filter>
12     </appender>
13
14     <logger name="java" additivity="false" />
15     <logger name="java.lang" level="DEBUG">
16         <appender-ref ref="STDOUT" />
17     </logger>
18
19     <root level="INFO">
20         <appender-ref ref="STDOUT" />
21     </root>
22
23 </configuration>

看到尽管<logger配置的是DEBUG,但是输出的只有warn,因为在<filter中对匹配到WARN级别时做了ACCEPT(接受),对未匹配到WARN级别时做了DENY(拒绝),只能打印出WARN级别的日志。

ThresholdFilter

1 <?xml version="1.0" encoding="UTF-8" ?>2 <configuration scan="false" scanPeriod="60000" debug="false">3 4     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">5         <encoder>6             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>7         </encoder>8         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">9             <level>INFO</level>
10         </filter>
11     </appender>
12
13     <logger name="java" additivity="false" />
14     <logger name="java.lang" level="DEBUG">
15         <appender-ref ref="STDOUT" />
16     </logger>
17
18     <root level="INFO">
19         <appender-ref ref="STDOUT" />
20     </root>
21
22 </configuration>

ThresholdFilter的策略是,会将日志级别小于的全部进行过滤,因此虽然指定了DEBUG级别,但是只有INFO及以上级别的才能被打印出来。

logback的mavan配置

logback.xml 使用需要依赖三个 jar 包,分别是 slf4j-api,logback-core,logback-classic。spring boot工程不需要引入依赖,就可以直接使用。

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version></dependency>

整体配置如下

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="30 seconds" debug="true"><property name="LOG_HOME" value="logs/pcm"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><layout class="ch.qos.logback.classic.PatternLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n</Pattern></layout></appender><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern><maxFileSize>10MB</maxFileSize><maxHistory>31</maxHistory><totalSizeCap>10GB</totalSizeCap></rollingPolicy><layout class="ch.qos.logback.classic.PatternLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n</Pattern></layout></appender><appender name="ONE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- rollover daily --><fileNamePattern>${LOG_HOME}/oneInfo/%d{yyyy-MM-dd}/oneInfo.%i.txt</fileNamePattern><maxFileSize>10MB</maxFileSize><maxHistory>31</maxHistory><totalSizeCap>10GB</totalSizeCap></rollingPolicy><layout class="ch.qos.logback.classic.PatternLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n</Pattern></layout></appender><appender name="TWO_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- rollover daily --><fileNamePattern>${LOG_HOME}/twoInfo/%d{yyyy-MM-dd}/twoInfo.%i.txt</fileNamePattern><maxFileSize>10MB</maxFileSize><maxHistory>31</maxHistory><totalSizeCap>10GB</totalSizeCap></rollingPolicy><layout class="ch.qos.logback.classic.PatternLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n</Pattern></layout></appender><logger name="oneInfo" level="DEBUG" additivity="false"><appender-ref ref="ONE_INFO" /></logger><logger name="twoInfo" level="WARN" additivity="true"><appender-ref ref="TWO_INFO" /></logger><root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="FILE" /></root></configuration>

该java的代码示例如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/***
* Title: logbackTest
* Description:
* logback日志测试
* Version:1.0.0
* @author pancm
* @date 2018年1月24日*/
public class logbackTest {private static Logger LOG = LoggerFactory.getLogger(logbackTest.class);private static Logger LOG2 = LoggerFactory.getLogger("oneInfo");private static Logger LOG3 = LoggerFactory.getLogger("twoInfo");public static void main(String[] args) {test();}private static void test(){LOG.debug("主程序的debug");LOG.info("主程序的info");LOG.warn("主程序的warn");LOG.error("主程序的error");LOG2.debug("oneInfo的debug");LOG2.info("oneInfo的info");LOG2.warn("oneInfo的warn");LOG2.error("oneInfo的error");LOG3.debug("twoInfo的debug");LOG3.info("twoInfo的info");LOG3.warn("twoInfo的warn");LOG3.error("twoInfo的error");}

参考链接:
https://www.cnblogs.com/xrq730/p/8628945.html
https://blog.csdn.net/xintonghanchuang/article/details/91348257

Logback日志配置和简单使用相关推荐

  1. mybatis动态查询(分页排序搜索)+分解关联查询+Logback 日志配置(打印sql到控制台)+mybatis新增记录后返回自增的id。批量=11/2~11/20

    一.mybatis动态查询(分页排序搜索) mybatis框架分页实现,有几种方式,最简单的就是利用原生的sql关键字limit来实现,还有一种就是利用interceptor来拼接sql,实现和lim ...

  2. SpringBoot-Spring profile多环境logback日志配置

    SpringBoot-Spring profile多环境logback日志配置 Spring profile多环境配置 参考 Spring profile是Spring 3引入的概念,主要用在项目多环 ...

  3. logback日志配置(控制台日志、输出日志、错误日志)

    logback日志配置(控制台日志.输出日志.错误日志) 一.logback.xml相关配置: <?xml version="1.0" encoding="UTF- ...

  4. logback日志配置详解

    一. 近期自己的项目想要一个记录日志的功能,而springboot本身就内置了日志功能,然而想要输入想要的日志,并且输出到磁盘,然后按天归档,或者日志的切分什么的,自带的日志仅仅具有简单的功能,百度了 ...

  5. spring boot—自定义logback日志配置

    自定义日志配置 spring boot2.2.4官方文档 logback中文文档    1)spring boot可以适应所有日志框架,只需在类路径下包含相应的依赖来激活各种日志系统.    2)sp ...

  6. logback日志框架的简单使用

    最近在自己搭建项目的时候,遇到logback选的问题,现在记录如下 在框架中使用logback日志框架,关于logback和log4j日志框架的选择,这里就不多说了网上百度一大堆,总之一句话 logb ...

  7. springboot logback 日志配置。

    下面的引用 SizeAndTimeBasedRollingPolicy  只能是1.2版本以上 ,如果是spring starter 中已经引用了,直接修改日志版本号即可 即在pom中加入: < ...

  8. logback日志配置

    直接复制讲一下好了 比较简单 logback 可以看到执行的sql了 mybatis执行的sql了 <?xml version="1.0" encoding="UT ...

  9. Logback日志配置(分级别输出到不同文件)

    <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false ...

最新文章

  1. win nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are depr
  2. HDU2888(二维RMQ)
  3. python tkinter 输入数字 小数_Python3 tkinter基础 Entry validate isdigit 只能输入数字的输入框...
  4. Reusability1
  5. adobe FMS(flash media server)错误解决小结
  6. jenkins配置节点为windows代理
  7. C语言格式化输出日期时间
  8. 华创e路航固件_华创e路航地图升级工具 v1.0 官方版(图文)
  9. 人脸识别之人脸识别技术综述
  10. java4.25生成车牌号_泸牌16年涨882倍 超25万人拍一张车牌为哪般?
  11. 无需翻墙解决谷歌浏览器-谷歌翻译无法使用的解决方法
  12. 王思聪喜欢的女生类型是这样的?
  13. FESCO数字一体化建设项目简介
  14. Google Earth Engine——美国人口数据可视化分析
  15. 把句子拆分成单词 java_java – 将句子分成单词和标点符号
  16. php 炒粉,市委书记在夜排档吃炒粉,一定是摆拍?
  17. 从程序员到asp.net架构师转变(转载)
  18. 大学生应该做的18件事
  19. 功能简单的erp软件
  20. ubuntu 18.04 安装NVIDIA 显卡驱动

热门文章

  1. Cocostudio导入.fla文件注意事项
  2. matlab 2015 积分,浅谈MATLAB在数值积分中的应用
  3. autorecover mac的ppt_Office for Mac快捷键之苹果PowerPoint幻灯片PPT篇
  4. Uva1665岛屿——并查集
  5. 微型计算机的内存乘储器,微型计算机及接口技术名词解释题及解答题
  6. HTML学生个人网站作业设计:电影网站设计——电影购票项目(9页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  7. Unity中的Transform Gizmo中的Pivot和Center
  8. 音视频篇 - FFmpeg 的介绍和使用
  9. 建木DevOps流程的快速运用
  10. 服务器与Linux初体验