logback⽇志pattern_如何正确配置logback
cardboard
⼀般来说,使⽤logback需要引⽤下⾯三个包:
ch.qos.logback:logback-classic
org.slf4j:jul-to-slf4j
org.slf4j:log4j-over-slf4j
不过⼀般来说,如果你引⼊了spring boot的starter(org.springframework.boot:spring-boot-starter),那么它会⾃动引⽤依赖spring-boot-starter-logging,⽽它⾃动包含了上⾯的三个包。也就是你使⽤spring boot的时候logback的包是⾃动引⽤的。
如何配置
spring boot会⾃动加载resources⽬录下的l(groovy),l(groovy),spring官⽅推荐的是后⾯的⼀种⽅式。
例如我们要向项⽬中添加vy的配置(xml的配置类似,这⾥就不赘述了)
⾸先,添加groovy的依赖:vy:groovy-all (xml可以省略这⼀步)
之后在⽂件⾥添加默认的logback信息
import static ch.qos.logback.classic.Level.INFO
import ch.qos.der.PatternLayoutEncoderleadto
import ch.ConsoleAppender
appender("CONSOLE", ConsoleAppender) {
encoder(PatternLayoutEncoder) {
pattern = "%d{yyyy/MM/dd-HH:mm:ss} %-5level [%thread] %class{5}:%line>>%msg%n"
}
}
root(INFO, ["CONSOLE"])
之后在代码⾥就可以添加logger来输出了
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class TestService {
private static final Logger logger = Logger(TestService.class);
public String test() {
String res = "test";
logger.info("log: {}", res);
return res;
失序}
}
这⾥顺便说⼀下,Logger()⾥⾯会设置该logger所对应的名字,⽀持class和String,这⼀点在之后的配置中⼗分重要。
pattern
上⾯⽂件的pattern规定了输出⽇志的格式,官⽅可以查到⾥⾯⼀些关键词的意思,这⾥捡⼀些重要的说:
%c{n} (%lo{n}, %logger{n}) 所对应logger的名字,后⾯跟长度,如果长度过长会吧前⾯的包名省略到⾸字母。
%C{n}(%class{n}) logger所在class的名字,其他的和上⾯⼀样。⼀般来说logger的名字和所在的class名字最好⼀样
%d{pattern} (%date{pattern}) 时间,pattern⾥可以⽤分号来指定输出多个
%L(%line) logger所在⽂件的⾏数
%m(%msg,%message) logger的信息
%p(%le, %level) ⽇志等级
%t(%thread) 线程名
%X{key:-defaultVal}(%mdc{key:-defaultVal}) MDC信息,MDC也是log4j的东西,也⾃然可以⽤在这⾥
%ex{depth}(%exception{depth}, %throwable{depth}) 错误信息,默认值是full,也就是全栈打出
制表对齐
%n 如果长度不够会在左边加空格
%-n 如果长度不够会在右边加空格
%.n 如果长度超过会从开头开始截取直到长度对应
%.-n 如果长度超过会从结尾开始截取直到长度对应
%n.m 第⼀种情况和第三种情况结合,1、2和3、4可以任意结合
此外,还可以通过"%black", "%red", "%green","%yellow","%blue", "%magenta","%cyan", "%white", "%gray",
"%boldRed","%boldGreen", "%boldYellow", "%boldBlue", "%boldMagenta""%boldCyan", "%boldWhite"和"%highlight"来加颜⾊。输出到⽂件
虽然调试的时候我们可以使⽤consle来看⽇志,不过要是线上环境的话不太可能⽤这个。把写到⽂件⾥是⼀个⾮常常⽤的做法。那么怎么设置输出到⽂件呢?
注意到⽂件上的appender了吗?只要把appender换成FileAppender就ok了,像这样:
import static ch.qos.logback.classic.Level.INFO
import ch.qos.der.PatternLayoutEncoder
import ch.FileAppender
appender("FILE", FileAppender) {
encoder(PatternLayoutEncoder) {
pattern = "%d{yyyy/MM/dd-HH:mm:ss} %-5level [%thread] %class{5}:%line>>%msg%n"
}
file = "path-to-file.log"
}
root(INFO, ["FILE"])
我全都要 呢?
那么,能不能 我全都要
当然可以,你甚⾄可以使⽤filter来让不同的appender输出不同的⽇志
import static ch.qos.logback.classic.Level.DEBUG
import static ch.qos.logback.classic.Level.INFO
import static ch.spi.FilterReply.ACCEPT
import static ch.spi.FilterReply.DENY
import ch.qos.der.PatternLayoutEncoder
import ch.qos.logback.classic.filter.LevelFilter
import ch.ConsoleAppender
import ch.FileAppender
appender("CONSOLE", ConsoleAppender) {
encoder(PatternLayoutEncoder) {
pattern = "%d{yyyy/MM/dd-HH:mm:ss} %-5level [%thread] %class{5}:%line>>%msg%n" }
}死机英文
appender("FILE", FileAppender) {
filter(LevelFilter) {
level = INFO
onMatch = ACCEPT
onMismatch = DENY
}
encoder(PatternLayoutEncoder) {
pattern = "%d{yyyy/MM/dd-HH:mm:ss} %-5level [%thread] %class{5}:%line>>%msg%n" }
file = "path-to-file.log"
}
root(DEBUG, ["CONSOLE", "FILE"])
切分⽇志⽂件
使⽤RollingFileAppender
import static ch.qos.logback.classic.Level.INFO
import static ch.spi.FilterReply.ACCEPT
import static ch.spi.FilterReply.DENY
import ch.qos.der.PatternLayoutEncoder
import ch.qos.logback.classic.filter.LevelFilter
import ch.olling.RollingFileAppender
import ch.olling.TimeBadRollingPolicy
import ch.util.FileSize
appender("FILE", RollingFileAppender) {
filter(LevelFilter) {
level = INFO
onMatch = ACCEPT
onMismatch = DENY
}
file = "path-to-file.log"
encoder(PatternLayoutEncoder) {
pattern = "%d{yyyy/MM/dd-HH:mm:ss} %-5level [%thread] %class{5}:%line>>%msg%n" }产生英文
rollingPolicy(TimeBadRollingPolicy) {
do the bestfileNamePattern = "past-%d{yyyy-MM-dd}.log"
maxHistory = 30
totalSizeCap = FileSize.valueOf("2GB")
}
}
天津djroot(INFO, ["FILE"])
可以看到相⽐于FileAppender,RollingFileAppender⾥⾯多了⼀个rollingPolicy的元素。其实RollingFileAppender⾥需要RollingPolicy 和TriggeringPolicy两个策略类型,⼀个⽤于决定轮换策略⼀个⽤于决定出发策略。但是TimeBadRollingPolicy继承了这两个策略类型,所以只要设置⼀个就可以了。
在TimeBadRollingPolicy⾥需要设置3个参数:
fileNamePattern: 分隔出来⽂件的命名⽅式,基本上是按时间来区分
maxHistory: 保留时间,超过这个时间的⽇志⽂件会⾃动删除
totalSizeCap: 每个单独的⽇志⽂件最⼤⼤⼩,如果超过这个⼤⼩会⾃动分割
当然还有其他可以设置的参数(⽐如压缩策略),具体可以参看TimeBadRollingPolicy的源代码
⾃定义appender以及layout
issuingauthority我们可以看到所有的appender都继承了ch.Appender这个借⼝。事实上你只要你的appender继承这个接⼝之后完成⾥⾯的三个函数就可以了,其中最重要的是doAppend(E var1)这个函数,这个函数决定了log事件过来你会怎么处理。重写这个函数就可以了。
不过以上⽤的appender都是继承OutputStreamAppender,它会将⽇志信息以流式来处理。只要重现⼀下append(E var1)这个函数会⾃动帮你变成流输出。
对应不同环境
我们都知道spring可以通过设置spring.profiles.active的值来让系统指定对应的application配置⽂件。那么logback怎么做呢?
⼀种⽅法是在对应的application配置⽂件⾥或者启动时添加参数fig(仅限spring boot,其他应⽤可以使⽤
另⼀种⽅法是在配置⽂件⾥⾯使⽤springProfile(groovy 暂不⽀持springProfile,所以只能⽤xml):
<configuration>
was怎么读
<springProfile name="prod">
...
新年快乐的英文
</springProfile>
<springProfile name="dev,test">
...
</springProfile>
</configuration>