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> |