Created by admin, last modified on 四月 09, 2024
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:ss,SSS 会被当作时区。如果你想在日期模式中使用逗号,那么你可以这样使用,%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