Logback 继承自Log4j,它建立在有十年工业经验的日志系统之上。它比其它所有的日志系统更快并且更小,包含了许多独特并且有用的特性。logback需和SLF4J配合使用,所以在工程中除了需引入Logback的jar包,还需引入SLF4J的jar包;文中所使用到的软件版本:Java 1.8.0_191、logback 1.2.3、slf4j 1.7.29。

1、配置

1.1、加载配置

Logback能够在初始化期间自动查找配置文件进行配置;按照优先级查找配置文件直到找到,优先级如下:

1、查找系统属性logback.configurationFile对应的配置文件
2、在classpath下查找logback-test.xml
3、在classpath下查找logback.groovy
4、在classpath下查找logback.xml
5、通过JDK提供的ServiceLoader工具在类路径下寻找文件META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了Configurator接口的实现类的全限定类名
6、如果以上都没有成功,logback会通过BasicConfigurator为自己进行配置,并且日志将会全部在控制台打印出来。

1.2、自动更新配置

<configuration>标签上添加 scan=true属性,可以让Logback自动定期扫描配置文件;默认一分钟扫描一次配置文件,<configuration> 标签上的 scanPeriod 属性可以指定扫描周期。扫描周期的时间单位可以是毫秒、秒、分钟或者小时。

<configuration scan="true" scanPeriod="30 seconds">

</configuration>

2、Appenders

2.1、ConsoleAppender

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
</encoder>
</appender>

输出日志到控制台,有如下常用参数:

name 输出目的地名称
target SYSTEM_OUT或SYSTEM_ERR,默认为SYSTEM_OUT
encoder encoder是处于Appender与Layout之间的一个中间层,它将日志事件转换为字节数组,并将字节数组写入到一个OutputStream中
withJansi 是否显示彩色代码,默认为false

2.2、FileAppender

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>D:/temp/aa.log</file>
<encoder>
<pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
</encoder>
</appender>

输出日志到文件,有如下常用参数:

name 输出目的地名称
append 日志是否追加到文件里,默认为true
encoder encoder是处于Appender与Layout之间的一个中间层,它将日志事件转换为字节数组,并将字节数组写入到一个OutputStream中
file 日志文件名
prudent 是否严格模式,默认为false;严格模式下写日志速度较慢
immediateFlush 日志事件是否被立即刷新到底层的输出流,默认为true;设为true可以提高吞吐率

2.2、RollingFileAppender

轮转日志文件输出日志,有如下常用参数:

name 输出目的地名称
append 日志是否追加到文件里,默认为true
encoder encoder是处于Appender与Layout之间的一个中间层,它将日志事件转换为字节数组,并将字节数组写入到一个OutputStream中
file 日志文件名
prudent 是否严格模式,默认为false;严格模式下写日志速度较慢
rollingPolicy 当轮转发生时,指定RollingFileAppender的行为
triggeringPolicy 告诉RollingFileAppender什么时候发生轮转行为

2.2.1、TimeBasedRollingPolicy

<!-- 按天轮训 ,保存10天的历史记录,总的最大大小为 3GB-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>D:/temp/bb.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>10</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>

TimeBasedRollingPolicy基于时间来定义轮转策略,它既负责轮转的行为,也负责触发轮转。有如下参数:

fileNamePattern 必选参数,定义了轮转时得文件名,需加上表示日期的参数%d,格式需符合java.text.SimpleDateFormat;如果以.gz或者.zip结尾,则启动文件自动压缩
maxHistory 最多的归档文件数量
totalSizeCap 控制所有归档文件总的大小。当达到这个大小后,旧的归档文件将会被异步的删除。使用这个属性时需要设置maxHistory属性,maxHistory会被作为第一条件,该属性作为第二条件
cleanHistoryOnStart 如果设置为true,appender启动的时候,归档文件将会被删除。默认的值为 false

2.2.2、SizeAndTimeBasedRollingPolicy

<!-- 按天及日志文件大小轮训 ,保存10个文件历史记录,总的最大大小为 3GB-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>D:/temp/bb.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>200MB</maxFileSize>
<maxHistory>10</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>

SizeAndTimeBasedRollingPolicy基于大小及时间来定义轮转策略,它既负责轮转的行为,也负责触发轮转。有如下参数:

fileNamePattern 必选参数,定义了轮转时得文件名,需加上表示日期的%d参数及表示序号的%i参数,日期格式需符合java.text.SimpleDateFormat,序号从0开始;如果以.gz或者.zip结尾,则启动文件自动压缩
maxFileSize 日志文件达到了maxFileSize指定的大小,会进行归档
maxHistory 最多的归档文件数量
totalSizeCap 控制所有归档文件总的大小。当达到这个大小后,旧的归档文件将会被异步的删除。使用这个属性时需要设置maxHistory属性,maxHistory会被作为第一条件,该属性作为第二条件
cleanHistoryOnStart 如果设置为true,appender启动的时候,归档文件将会被删除。默认的值为 false

2.2.3、SizeAndTimeBasedRollingPolicy

<!--归档日志文件个数为5,依次为bb.1.log,...,bb.5.log-->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>D:/temp/bb.%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>5</maxIndex>
</rollingPolicy>

SizeAndTimeBasedRollingPolicy基于固定窗口算法重命名日志文件,它只负责轮转的行为。有如下参数:

fileNamePattern 必选参数,定义了轮转时得文件名,需加上表示序号的%i参数,序号从0开始;如果以.gz或者.zip结尾,则启动文件自动压缩
minIndex 表示窗口索引的下界
maxIndex 表示窗口索引的上界

2.2.4、SizeBasedTriggeringPolicy

<!--日志文件达到5M就行归档-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>

SizeBasedTriggeringPolicy基于文件大小的触发器,它只负责触发轮转。有如下参数:

maxFileSize 日志文件达到了maxFileSize指定的大小,会进行归档

3、Layouts

logback提供了PatternLayout、HTMLLayout、XMLLayout等等,这里着重介绍PatternLayout。

<pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>

PatternLayout通过参数来格式化日志信息,与log4j 1.x中的用法很类似:

d{pattern}、date{pattern}、d{pattern, timezone}、date{pattern, timezone} 输出日志记录事件的日期,可以在其后指定格式;如:%d{dd MMM yyyy HH:mm:ss,SSS},输出类似:02 Nov 2012 14:34:02,781
p、le、level 输出日志记录事件的优先级
t、thread 输出生成日志记录事件的线程的名称
c{length}、lo{length}、logger{length} 输出日志记录事件的类别;后面可以给出精度,如类别为"org.apache.commons.Foo";%c{1}将输出"Foo",%c{1.}将输出"o.a.c.Foo"
C{length}、class{length} 输出发出日志记录请求的调用方的完全限定类名称;后面可以给出精度,与c{precision}类似。
M、method 输出发出日志记录请求的方法名称。该操作代价较高,可能会影响性,小心使用。
F、file 输出发出日志记录请求的文件名。该操作代价较高,可能会影响性,小心使用。
L、line 输出发出日志记录请求的文件行号。该操作代价较高,可能会影响性,小心使用。
m、msg、message 输出应用程序提供的消息
n 输出与平台相关的行分隔符,Windows平台为\r\n,Unix平台为\n
X{key:-defaultVal}、mdc{key:-defaultVal}用于输出与生成日志记录事件的线程关联的MDC(嵌套诊断上下文)。如%MDC{userid:-admin},-后面表示默认值。

4、Filters

Filters用来确定日志是否被输出。通常情况下,过滤器的逻辑由两个正交的部分组成,onMatch/onMismatch的检验。onMatch:匹配过滤器时执行的动作,onMismatch:不匹配过滤器时执行的动作;这两个参数的值可以为: ACCEPT、DENY 或NEUTRAL。ACCEPT表示输出日志;DENY表示不输出日志;NEUTRAL一般用于多个过滤器中,表示执行下一个过滤器。

在多个过滤器一起使用时:
如果一个过滤器配置为onMatch="ACCEPT"(或onMismatch="ACCEPT"),并且日志消息匹配onMatch(或匹配onMismatch),则输出该日志消息并忽略后面的过滤器;
如果一个过滤器配置为onMatch="DENY"(或onMismatch="DENY"),并且日志消息匹配onMatch(或匹配onMismatch),则不输出该日志消息并忽略后面的过滤器;
如果一个过滤器配置为onMatch="NEUTRAL"(或onMismatch="NEUTRAL"),并且日志消息匹配onMatch(或匹配onMismatch),则继续执行后面的过滤器。

4.1、LevelFilter

日志级别过滤器,判断日志级别是否与配置的级别相等。

<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>NEUTRAL</onMatch>
<onMismatch>DENY</onMismatch>
</filter>

4.2、ThresholdFilter

阈值过滤器,输出日志级别是否大于等于配置的日志。

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>

这两个过滤器比较简单,还有其他一些较复杂的过滤器:GEventEvaluator、JaninoEventEvaluator等等,这里就不介绍了,可以参考官方文档:http://logback.qos.ch/manual/filters.html

5、实际使用

5.1、配置文件logback.xml

该文件放到src或src/main/resources(spring boot工程)下即可。

<?xml version="1.0" encoding="utf-8"?>
<configuration debug="false">
<timestamp key="bySecond" datePattern="yyyyMMddHHmmss" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter> <encoder>
<pattern>[logback]%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>D:/temp/aa-${bySecond}.log</file>
<encoder>
<pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
</encoder>
<immediateFlush>true</immediateFlush>
</appender> <appender name="RollingFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>D:/temp/bb.log</file> <!-- 按天轮训 ,保存10天的历史记录,总的最大大小为 3GB-->
<!-- rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>D:/temp/bb.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>10</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy--> <!-- 按天及日志文件大小轮训 ,保存10个文件历史记录,总的最大大小为 3GB-->
<!-- rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>D:/temp/bb.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>3KB</maxFileSize>
<maxHistory>10</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy--> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>D:/temp/bb.%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>3KB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d %-5level [%thread] %logger[%L] -> %m%n</pattern>
</encoder>
</appender> <root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="RollingFILE" />
</root> </configuration>

5.2、代码例子

package com.inspur.demo.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* Logback使用示例
*/
public class LogbackCase {
public static final Logger logger = LoggerFactory.getLogger(LogbackCase.class);
public static void main(String[] args) throws Exception {
logger.debug("This is debug message.");
logger.warn("This is warn message.");
for (int i = 0; i < 100; i++) {
logger.info("This is info message:" + i);
}
}
}

运行代码可以看到控制台及相关的文件中生成了日志消息。

Java日志介绍(3)-Logback的更多相关文章

  1. 拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系

    log4j 以及 logback, slf4j 官网 日志框架的困惑 作为一个正常的项目,是必须有日志框架的存在的,没有日志,很难追踪一些奇奇怪怪的系统问题. 但是,我们经常在项目的依赖中,见到奇奇怪 ...

  2. Java日志框架:logback详解

    为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结 ...

  3. 【转】Java日志框架:logback详解

    为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结 ...

  4. (网页)Java日志记录框架Logback配置详解(企业级应用解决方案)(转)

    转自CSDN: 前言 Logback是现在比较流行的一个日志记录框架,它的配置比较简单学习成本相对较低,所以刚刚接触该框架的朋友不要畏惧,多花点耐心很快就能灵活应用了.本篇博文不会具体介绍Logbac ...

  5. Java日志介绍(4)-Log4j2

    Log4j2是Log4j的升级版,相比其前身Log4j 1.x提供了显著的改进,并提供了在Logback中提供的许多改进,同时修复了Logback体系结构中的一些固有问题. Log4j2的内容很多,本 ...

  6. Java日志介绍(2)-Log4j

    Log4j是Apache的一个开源项目,官网地址为http://logging.apache.org/log4j/1.2/index.html.通过使用Log4j,可控制日志信息输出到控制台.文件.数 ...

  7. java日志框架之logback(一)——logback工程简介

    Logback工程 致力于成为log4j工程的继承者 Logback的架构足够泛型化,故能够应用于许多不同的环境.当前,logback划分为三个组件: logback-core logback-cla ...

  8. spring boot 日志介绍 以及 logback配置示例

    https://www.cnblogs.com/flying607/p/7827460.html 以下是springboot的一个局部依赖关系: 可以看到,java util logging(jul) ...

  9. Java日志Log4j或者Logback的NDC和MDC功能

    NDC和MDC的区别 Java中使用的日志的实现框架有很多种,常用的log4j和logback以及java.util.logging,而log4j是apache实现的一个开源日志组件(Wrapped ...

随机推荐

  1. 【javaScript】加减乘除的精确计算

    在js中使用"+"."-"等符号进行运算会出现很大的误差,所以需要自己创建函数进行精确运算. //说明:javascript的加法结果会有误差,在两个浮点数相加 ...

  2. Dappy如何防止DNS黑客入侵

    作者:Raphaël 译者注:Dappy是RChain生态中的DNS[域名系统(服务)协议].Dappy基于RChain的技术架构保障了域名系统的安全性. Dappy是一个用于文件和Web应用程序的去 ...

  3. iOS--->运行程序屏幕上下有黑边

    iOS--->运行程序屏幕上下有黑边 原因是LaunchImage没有设置好,图片等尺寸没有和对应的手机屏幕大小适配导致. 解决方法 就是要增加启动图片,把屏幕拉伸,匹配好每个机型的屏幕大小,这 ...

  4. geojson转esriJson

    因为一些特殊需求,需要将geojson转为shp数据,网上有一些转换网站,但是存在一些问题,例如中文乱码.文件大小限制等等,折腾了一下,还是觉得用arcgis转比较好,因此先将geojson转为esr ...

  5. Informatica9.5.1创建资源库出错找不到libpmora8.so

    错误信息: Database driver event...Error occurred loading library [libclntsh.so.10.1: cannot open shared ...

  6. <状压DP>solution-POJ3311_Hie with the Pie

    Hie with the Pie Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers ...

  7. 物流跟踪API-快递单订阅

    上一篇文章我们讲解了轨迹查询的接口,通过快递鸟接口可以实现实时查询物流轨迹,这次给大家推荐订阅服务功能. 为了更好的理解订阅服务,我们来做个对比, 即时查询是主动查询物流轨迹,需要我们主动调用接口才能 ...

  8. POJ_2593_DP

    http://poj.org/problem?id=2593 和2479一样. #include<iostream> #include<cstdio> #define MIN ...

  9. HDU_2191_多重背包

    http://acm.hdu.edu.cn/showproblem.php?pid=2191 简单多重背包题. #include<iostream> #include<cstdio& ...

  10. Codeforces 1092 D2 Great Vova Wall (Version 2) (栈)

    题意: 给一排砖,每列的高度$a_i$,问是否可以放1*2的砖,使得n列高度一样,砖只能横着放 思路: 每两个相邻的高度相同的砖可以变成大于等于它的高度的任意高度 所以像这样的 123321 是不满足 ...