slf4j

相当于接口(框架),而logback实现了slf4j的接口。

Logback配置文件结构

https://www.jianshu.com/p/b3dedb8fb61e

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
    <contextName></contextName>
<springProperty scope="context" name="logging.path" source="logging.path"/>
<property name="LOG_DIR" value="${catalina.base}/logs"/>
<property name="pattern" value="%d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level  %msg%n"/>
<appender></appender>  
<logger></logger>
<root></root> 
</configuration>

 

Configuration:根节点

contextName:上下文

property:自定义变量

Logger:自定义的日志打印对象

Root:系统定义的根打印对象,level设置打印级别,默认debug

Appender:日志打印组件

Filter,过滤器,Appender的元素。

 

https://www.jianshu.com/p/b3dedb8fb61e

 

Appender的种类

ConsoleAppender:把日志添加到控制台

FileAppender:把日志添加到文件

RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。它是FileAppender的子类

Filter的种类

DENY:日志将立即被抛弃,不再经过其他过滤器

ACCEPT:日志会被立即处理,不再经过剩余过滤器

NEUTRAL:有序列表里的下个过滤器过接着处理日志

 

过滤器

ThresholdFilter临界值过滤器

过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝DENY

LevelFilter级别过滤器

根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMatch(用于配置符合过滤条件的操作) 和 onMismatch(用于配置不符合过滤条件的操作)接收或拒绝日志。

https://blog.csdn.net/Mrs_chens/article/details/102455216

打印级别

https://blog.csdn.net/u012129558/article/details/79947477

TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF

TRACE < DEBUG < INFO < WARN < ERROR < FATAL

 

常用转换字符和参数

http://www.logback.cn/06第六章Layouts.html

%d:日期,

%thread:线程名,

%-5level:级别从左显示5个字符宽度

%msg:日志消息,

%n:换行符

%clr:指定颜色

日志logback详解_logback %clr-CSDN博客


转换字符

效果

c{length}
lo{length}
logger{length}

输出 logger 的名字作为日志事件的来源。转换字符接收一个作为它的第一个也是为一个参数。转换器的简写算法将会缩短 logger 的名字,但是通过不会丢失重要的信息。设置 length 的值为 0 是一个例外。它将会导致转换字符返回 logger 名字中最右边的点右边的字符。下面的表格提供了一个示例:

转换说明符

logger的名字

结果

%logger

mainPackage.sub.sample.Bar

mainPackage.sub.sample.Bar

%logger{0}

mainPackage.sub.sample.Bar

Bar

%logger{5}

mainPackage.sub.sample.Bar

m.s.s.Bar

%logger{10}

mainPackage.sub.sample.Bar

m.s.s.Bar

%logger{15}

mainPackage.sub.sample.Bar

m.s.sample.Bar

%logger{16}

mainPackage.sub.sample.Bar

m.sub.sample.Bar

%logger{26}

mainPackage.sub.sample.Bar

mainPackage.sub.sample.Bar

logger 名字最右边的部分永远不会被简写,即使它的长度比 length 的值要大。其它的部分可能会被缩短为一个字符,但是永不会被移除。

C{length}
class{length}

输出发出日志请求的类的全限定名称
%logger% 转换符一样,它也可以接收一个整型的可选参数去缩短类名。0 表示特殊含义,在打印类名时将不会输出包的前缀名。默认表示打印类的全限定名。
生成调用者类的信息并不是特别快。因此,应该避免使用,除非执行速度不是问题。

contextName
cn

输出日志事件附加到的 logger 上下文的名字。

d{pattern} date{pattern} d{pattern, timezone} date{pattern, timezone}

用于输出日志事件的日期。日期转换符允许接收一个字符串作为参数。字符串的语法与 SimpleDateFormat 中的格式完全兼容。
你可以指定 "ISO8601" 来表示将日期格式为 ISO8601 类型。如果没有指定日期格式,那么 %date 转换字符默认为 ISO860 类型
这里有一个例子。它假设当前时间为 2006.10.20 星期五,作者刚刚吃完饭准备写这篇文档。

转换模式

结果

%d

2006-10-20 14:06:49,812

%date

2006-10-20 14:06:49,812

%date{ISO8601}

2006-10-20 14:06:49,812

%date{HH:mm:ss.SSS}

14:06:49.812

%date{dd MMM yyyy;HH:mm:ss.SSS}

20 oct. 2006;14:06:49.812


第二个参数用于指定时区。例如, '%date{HH:mm:ss.SSS, Australia/Perth}' 将会打印世界上最孤立的城市,澳大利亚佩斯所在时区的日期。如果没有指定时区参数,则默认使用 Java 平台所在主机的时区。如果指定的时区不能识别或者拼写错误,则 TimeZone.getTimeZone(String)) 方法会指定时区为 GMT。
常见错误: 对于 HH:mm:ss,SSS 模式,逗号会被解析为分隔符,所以最终会被解析为 HH:mm:ssSSS 会被当作时区。如果你想在日期模式中使用逗号,那么你可以这样使用,%date{"HH:mm:ss,SSS"} 用双引号将日期模式包裹起来。

F / file

输出发出日志请求的 Java 源文件名。
由于生成文件的信息不是特别快,因此,应该避免使用,除非速度不是问题。

caller{depth}
caller{depthStart..depthEnd}
caller{depth, evaluator-1, ... evaluator-n}
caller{depthStart..depthEnd, evaluator-1, ... evaluator-n}

输出生成日志的调用者所在的位置信息。
位置信息依赖 JVM 的实现,但是通常由调用方法的全限定名以及调用者的来源组成。以及由圆括号括起来的文件名与行号。
caller 转换符还可以接收一个整形的参数,用来配置展示信息的深度。
例如,%caller{2} 会展示如下的信息:

0    [main] DEBUG - logging statement
Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)

%caller{3} 会展示如下信息:

16   [main] DEBUG - logging statement 
Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
Caller+2   at mainPackage.ConfigTester.main(ConfigTester.java:38)


caller 转换符还可以接收一个范围用来展示深度在这个范围内的信息。
例如,%caller{1..2} 会展示如下信息:

[main] DEBUG - logging statement 
Caller+0   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)


转换字符还可以接收一个 evaluator,在计算调用者数据之前通过指定的标准对日志事件进行测验。例如,%caller{3, CALLER_DISPLAY_EVAL} 会在 CALLER_DISPLAY_EVAL 返回一个肯定的答案,才会显示三行堆栈信息。
将在下面详细叙述 evaluator。

L / line

输出发出日志请求所在的行号。
生成行号不是特别快。因此,不建议使用,除非生成速度不是问题。

m / msg / message

输出与日志事件相关联的,由应用程序提供的日志信息。

M / method

输出发出日志请求的方法名。
生成方法名不是特别快,因此,应该避免使用,除非生成速度不是问题。

n

输出平台所依赖的行分割字符。
转换字符提供了像 "\n" 或 "\r\n" 一样的转换效果。因此指定行分隔符它是首选的指定方式。

p / le / level

输出日志事件的级别。

r / relative

输出应用程序启动到创建日志事件所花费的毫秒数

t / thread

输出生成日志事件的线程名。

X{key:-defaultVal}
mdc{key:-defaultVal}

输出生成日志事件的线程的 MDC (mapped diagnostic context)。
如果 MDC 转换字符后面跟着用花括号括起来的 kye,例 %MDC{userid},那么 'userid' 所对应 MDC 的值将会输出。如果该值为 null,那么通过 :- 指定的默认值 将会输出。如果没有指定默认值,那么将会输出空字符串。
如果没有指定的 key,那么 MDC 的整个内容将会以 "key1=val1, key2=val2" 的格式输出。
查详情请见 第八章

ex{depth} exception{depth} throwable{depth} ex{depth, evaluator-1, ..., evaluator-n} exception{depth, evaluator-1, ..., evaluator-n} throwable{depth, evaluator-1, ..., evaluator-n}

输出日志事件相关的堆栈信息,默认情况下会输出全部的堆栈信息。
throwable 转换词可以接收如下的参数:

  • *short*:输出堆栈信息的第一行
  • *full*:输出全部的堆栈信息
  • 任意整数:输出指定行数的堆栈信息


下面是一些示例:

转换模式

结果

%ex

mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
  at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
  at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)

%ex{short}


mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)

%ex{full}


mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
  at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
  at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)

%ex{2}

mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
  at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)


在输出前,转换字符还可以使用给定的标准再次检验日志事件。例如,使用 %ex{full, EX_DISPLAY_EVAL},只有 EX_DISPLAY_EVAL 返回一个否定的答案,才会输出全部的堆栈信息。evaluator 在接下来的文档中将会进一步叙述。
如果你没有指定 %throwable 或者其它跟 throwable 相关的转换字符,那么 PatternLayout 会在最后一个转换字符加上这个。因为堆栈信息非常的重要。如果你不想展示堆栈信息,那么可以使用 %nopex (作者原文为 $nopex) 可以替代 %throwable。详情见 %nopex。

xEx{depth}
xException{depth} xThrowable{depth}
xEx{depth, evaluator-1, ..., evaluator-n}
xException{depth, evaluator-1, ..., evaluator-n}
xThrowable{depth, evaluator-1, ..., evaluator-n}

跟 %throwable 类似,只不过多了类的包信息。
在每个堆栈信息的末尾,多了包含 jar 文件的字符串,后面再加上具体的实现版本。这项创造性的技术是来自 James Strachan 的建议。如果该信息不确定,那么类的包信息前面会有一个波浪号 (~)。
下面是一个例子:

java.lang.NullPointerException
  at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
  at  com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.5.0_06]
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.5.0_06]
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.5.0_06]
  at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
  at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
  at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98) [junit-4.4.jar:na]
  ...etc

logback 努力的去确保类的包信息正确的展示,即使是在复杂的类加载层次中。但是,一个不能保证信息的绝对正确,那么在这些数据的前面将会多一个波浪符 (~)。因此,从理论上来说,打印的类的包信息跟真实的类的包信息是有区别的。在上面的例子中,类 Wombat 的包信息前面有一个波浪符,在实际的情况中,它真实包可能为 [wombat.jar:1.7]。
但是请注意潜在的性能损耗,计算包信息默认是禁止的。当启用了计算包信息,那么 PatternLayout 将会自动认为在字符串模式的末尾 %xThrowable 替代了 %throwable。
根据用户的反馈,Netbeans 会阻止包信息的打印。

nopex
nopexception

这个转换字符不会输出任何数据,因此,它可以用来有效忽略异常信息。
%nopex 转换字符允许用户重写 PatternLayout 内部的安全机制,该机制将会在没有指定其它处理异常的转换字符时,默认添加 %xThrowable。

marker

输出与日志请求相关的标签。
一旦标签包含子标签,那么转换器将会根据下面的格式展示父标签与子标签。
parentName [child1, child2]

property{key}

输出属性 key 所对应的值。相关定义参见 定义变量 以及作用域。如果 key 在 logger context 中没有找到,那么将会去系统属性中找。
key 没有默认值,如果缺失,则会展示 " Property_HAS_NO_KEY" 的错误信息。

replace(p){r, t}

在子模式 'p' 产生的字符中,将所有出现正则表达式 'r' 的地方替换为 't'。例如,"%replace(%msg){'\s', ''}" 将会移除事件消息中所有空格。
模式 'p' 可以是任意复杂的甚至由多个转换字符组成。例如,"%replace(%logger %msg){'.', '/'}" 将会替换 logger 以及消息中所有的点为斜杆。

rEx{depth} rootException{depth} rEx{depth, evaluator-1, ..., evaluator-n} rootException{depth, evaluator-1, ..., evaluator-n}

输出与日志事件相关的堆栈信息,根异常将会首先输出,而是标准的"根异常最后输出"。下面是一个输出例子:

java.lang.NullPointerException
  at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
  at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
Wrapped by: org.springframework.BeanCreationException: Error creating bean with name 'wombat':
  at org.springframework.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248) [spring-2.0.jar:2.0]
  at org.springframework.AbstractBeanFactory.getBean(AbstractBeanFactory.java:170) [spring-2.0.jar:2.0]
  at org.apache.catalina.StandardContext.listenerStart(StandardContext.java:3934) [tomcat-6.0.26.jar:6.0.26]

%rootException 跟 %xException 类似,也允许一些可选的参数,包括深度以及 evaluator。它也会输出包信息。简单来说,%rootException 跟 %xException 非常的类似,仅仅是异常输出的顺序完全相反。
%rootException 的作者 Tomasz Nurkiewicz 在他的博客说明了他所作的贡献 "Logging exceptions root cause first"

 

格式修改器

格式修改器

 

左对齐

最小

宽度

最大

宽度

备注

%20logger

false

20

None

如果 logger 的名字小于 20 个字符的长度,那么会在左边填充空格

%-20logger

true

20

None

如果 logger 的名字小于 20 个字符的长度,那么会在右边填充空格

%.30logger

NA

None

30

如果 logger 的名字大于 30 个字符的长度,那么从前面开始截断

%20.30logger

false

20

30

如果 logger 的名字小于 20 个字符的长度,那么会从左边填充空格。但是如果 logger 的名字大于 30 字符,将会从前面开始截断

%-20.30logger

true

20

30

如果 logger 的名字小于 20 个字符的长度,那么从右边开始填充空格。但是如果 logger 的名字大于 30 个字符,将会从前面开始截断

%.-30logger

NA

None

30

如果 logger 的名字大于 30 个字符的长度,那么从后面开始截断

 

%.-1000msg