Logback 是一个基于 Java 的日志框架,被广泛应用于 Java 应用程序中。它是 Log4j 框架的改进版,提供了高度可配置的日志记录功能,具有灵活性和性能优势
Logback 包含了三个主要的组件:Logger、Appender 和 Layout。Logger 用于创建日志记录器,Appender 用于定义日志输出的目标,而 Layout 则定义了日志的格式。
以下是 Logback 的一些主要特点:
-
高度可配置:Logback 允许通过 XML 配置文件或者编程方式进行灵活的配置。你可以定义日志输出的级别、输出目标、格式等等。
-
继承 Log4j:Logback 被设计为 Log4j 的直接替代品,可以无缝迁移现有的 Log4j 配置文件到 Logback。
-
低开销:Logback 在设计上尽量减少对系统性能的影响,具有高效的异步日志记录机制和线程安全性。
-
支持多种输出:Logback 提供了多种 Appender,包括 ConsoleAppender、FileAppender、SocketAppender 等,可以将日志输出到控制台、文件、网络等不同目标。
-
灵活的过滤器:Logback 允许通过过滤器机制对日志进行过滤和处理,你可以根据日志级别、关键字等条件来过滤日志记录。
-
SLF4J 兼容:Logback 与 SLF4J(Simple Logging Facade for Java)框架无缝集成,SLF4J 提供了一个统一的日志门面,使得应用程序可以方便地切换日志框架而不需要修改代码。
下面是logba.xml配置文件引入java后台的流程和配置详解:
1查找默认配置文件
logback默认会查找以下文件
logback-test.xml
logback.groovy
logback.xml
2 配置节点
2.1 根节点<configuration>
根节点包含以下属性
- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
- scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
- debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<? xml version = "1.0" encoding = "UTF-8" ?> <!-- scan : 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true--> < configuration scan = "false" scanPeriod = "60 seconds" debug = "false" > </ configuration > |
2.2 子节点<appender>
负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。
appender实现类有以下几种。
1. ConsoleAppender 日志输出到控制台
< appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender" > < encoder > < pattern >stdout %d %p - %m%n</ pattern > </ encoder > </ appender > |
2. FileAppender 日志添加到文件(静态文件)
- <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
- <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
- <encoder>:对记录事件进行格式化。(具体参数稍后讲解 )
- <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
< appender name = "FILE" class = "ch.qos.logback.core.FileAppender" > < file >testFile.log</ file > < append >true</ append > < encoder > < pattern >%d %p - %m%n</ pattern > </ encoder > </ appender > |
3. RollingFileAppender(动态文件)
RollingFileAppender滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。
- <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
- <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
- <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类。
rollingPolicy有一些策略:
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy": 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
- <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。
- <maxHistory>:日志文件保留天数
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动
- <maxFileSize>:这是活动文件的大小,默认值是10MB。
- <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
- <triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。
class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根据固定窗口算法重命名文件的滚动策略
- <minIndex>:窗口索引最小值
- <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
- <fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
< appender name = "STDFILE" class = "ch.qos.logback.core.rolling.RollingFileAppender" > < file >log.txt</ file > < rollingPolicy class = "ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy" > <!-- 每天一归档 --> < fileNamePattern >mylog-%d{yyyy-MM-dd}.%i.txt</ fileNamePattern > <!-- 单个日志文件最多 100MB, 60天的日志周期,最大不能超过20GB,窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志 --> < maxFileSize >100MB</ maxFileSize > < maxHistory >60</ maxHistory > < totalSizeCap >20GB</ totalSizeCap > < minIndex >1</ minIndex > < maxIndex >3</ maxIndex > </ rollingPolicy > < encoder > < pattern >%msg%n</ pattern > </ encoder > </ appender > |
2.3.root节点,必选节点
< root level = "INFO" > < appender-ref ref = "CONSOLE" /> < appender-ref ref = "INFO_FILE" /> < appender-ref ref = "WARN_FILE" /> < appender-ref ref = "ERROR_FILE" /> </ root > |
2.4 logger节点,可选节点
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
additivity:是否继承root节点,默认是true继承。默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。
2.5. 子节点<property>
用来定义变量值,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。
< property name = "log.path" value = "logs" ></ property > |
2.6子节点<contextName>
用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
< configuration scan = "true" scanPeriod = "60 seconds" debug = "false" > < contextName >myApp</ contextName > <!--其他配置省略--> </ configuration > |
3.完整的Logback.xml
<? xml version = "1.0" encoding = "UTF-8" ?> < configuration scan = "true" scanPeriod = "60 seconds" debug = "false" > <!-- 日志上下文名称 --> < contextName >realtime-flink</ contextName > <!-- 日志输出编码 --> < property name = "log.charset" value = "utf-8" /> <!-- 日志存放路径 --> < property name = "log.path" value = "logs" /> <!-- 日志输出格式 --> < property name = "log.pattern" value = "%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)" /> <!-- 控制台输出 --> < appender name = "console" class = "ch.qos.logback.core.ConsoleAppender" > < encoder > < pattern >${log.pattern}</ pattern > </ encoder > </ appender > <!-- 系统日志输出 --> < appender name = "file_info" class = "ch.qos.logback.core.rolling.RollingFileAppender" > < file >${log.path}/info.log</ file > <!-- 循环政策:基于时间创建日志文件 --> < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <!-- 日志文件名格式 --> < fileNamePattern >${log.path}/info.%d{yyyy-MM-dd}.log</ fileNamePattern > <!-- 日志最大的历史 180天 --> < maxHistory >180</ maxHistory > </ rollingPolicy > < encoder class = "net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder" > < providers > < pattern > < pattern >{"log":"%date{yyyy-MM-dd HH:mm:ss.SSS}[%thread] %level %logger:%method:%line - %message", "time":"%date{yyyy-MM-dd HH:mm:ss.SSS}", "stream":"file"}%n </ pattern > </ pattern > </ providers > </ encoder > < filter class = "ch.qos.logback.classic.filter.LevelFilter" > <!-- 过滤的级别 --> < level >INFO</ level > <!-- 匹配时的操作:接收(记录) --> < onMatch >ACCEPT</ onMatch > <!-- 不匹配时的操作:拒绝(不记录) --> < onMismatch >DENY</ onMismatch > </ filter > </ appender > < appender name = "file_error" class = "ch.qos.logback.core.rolling.RollingFileAppender" > < file >${log.path}/error.log</ file > <!-- 循环政策:基于时间创建日志文件 --> < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <!-- 日志文件名格式 --> < fileNamePattern >${log.path}/error.%d{yyyy-MM-dd}.log</ fileNamePattern > <!-- 日志最大的历史 180天 --> < maxHistory >180</ maxHistory > </ rollingPolicy > < encoder class = "net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder" > < providers > < pattern > < pattern >{"log":"%date{yyyy-MM-dd HH:mm:ss.SSS}[%thread] %level %logger:%method:%line - %message", "time":"%date{yyyy-MM-dd HH:mm:ss.SSS}", "stream":"file"}%n </ pattern > </ pattern > </ providers > </ encoder > < filter class = "ch.qos.logback.classic.filter.LevelFilter" > <!-- 过滤的级别 --> < level >ERROR</ level > <!-- 匹配时的操作:接收(记录) --> < onMatch >ACCEPT</ onMatch > <!-- 不匹配时的操作:拒绝(不记录) --> < onMismatch >DENY</ onMismatch > </ filter > </ appender > <!-- 系统模块日志级别控制 TODO 生产改成info --> < logger name = "cn.ctyun.bigdata" level = "debug" /> <!-- Spring日志级别控制 --> < logger name = "org.springframework" level = "warn" /> <!--系统调试日志--> < root level = "info" > < appender-ref ref = "console" /> </ root > <!--系统操作日志--> < root level = "info" > < appender-ref ref = "file_info" /> < appender-ref ref = "file_error" /> </ root > <!--监控sql日志输出 TODO 生产可以改成OFF--> < logger name = "jdbc.sqlonly" level = "INFO" additivity = "false" > < appender-ref ref = "console" /> </ logger > < logger name = "jdbc.resultset" level = "ERROR" additivity = "false" > < appender-ref ref = "console" /> </ logger > <!-- 如想看到表格数据,将OFF改为INFO --> < logger name = "jdbc.resultsettable" level = "OFF" additivity = "false" > < appender-ref ref = "console" /> </ logger > < logger name = "jdbc.connection" level = "OFF" additivity = "false" > < appender-ref ref = "console" /> </ logger > < logger name = "jdbc.sqltiming" level = "OFF" additivity = "false" > < appender-ref ref = "console" /> </ logger > < logger name = "jdbc.audit" level = "OFF" additivity = "false" > < appender-ref ref = "console" /> </ logger > </ configuration > |