文章目录
- 一、logback介绍
- 二、取代log4j的理由
- 三、logback的配置及使用
- 1、首先你要使用logback,需要导入依赖
- 2、logback默认配置
- 3、lobback.xml常用配置详解
- 1、logback的配置文件概述
- 2、根节点configuration,包含下面三个属性:
- 3、字节的logger
- 4、子节点appender
- 1、ConsoleAppender把日志输出控制台。
- 2、FileAppender:把日志添加到文件。
- 3、RollingFileAppender:滚动记录文件
- 基于时间TimeBasedRollingPolicy
- 基于大小和时间SizeAndTimeBasedRollingPolicy
- 四、logback的日志名称问题
一、logback介绍
https://www.docs4dev.com/docs/zh/logback/1.3.0-alpha4/reference/appenders.html
- logback-core:其它两个模块的基础模块
- logback-classic:log4j的改良版,同时它完整实现了slf4j API,我们可以很方便地更换成其它日志系统如log4j或JDK14 Logging
- logback-access:访问模块与Servlet容器集成,提供通过Http来访问日志的功能
二、取代log4j的理由
说实话,我对log4j日志使用不太清楚,只知道大概的使用步骤
据网上说,总的来说就是logback内核重写了,关键执行路径性能更好,内存消耗更少,去除旧的日志啊一系列更好的功能。
三、logback的配置及使用
1、首先你要使用logback,需要导入依赖
父pom依赖引入:
org.springframework.boot spring-boot-starter-parent 2.5.6
点击spring-boot-start-parent依赖,进入
org.springframework.boot
spring-boot-dependencies
2.5.6
spring-boot-depencies中已经包含了logback使用所需要的依赖,如下:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
2、logback默认配置
级别排序为: TRACE < DEBUG < INFO < WARN < ERROR
如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。
最小化配置由一个关联到根 logger 的ConsoleAppender 组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 进行格式化。
root logger 默认级别是 DEBUG。
上面这里这样说可以不是很清晰,没关系,接着往下看,自然就能理解了。
- 尝试在 classpath下查找文件logback-test.xml;
- 如果文件不存在,则查找文件logback.xml;
- 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。
3、lobback.xml常用配置详解
1、logback的配置文件概述
配置文件的最基本结构可以描述为configuration>元素,包含零个或多个logger元素,然后是零个或多个元素,最多包含一<root元素。下图说明了此基本结构。
2、根节点configuration,包含下面三个属性:
- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
- scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
- debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <!--其他配置省略--> </configuration>
子节点contextName:
用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。
但可以使用contextName设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
<contextName>myAppName</contextName>
子节点property:
定义变量的值,两个熟悉name和value,通过property元素设置的值,插入到logger上下文中,可以使用${}使用变量,通常为存储路径。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_Name" value="myAppName" />
<contextName>${APP_Name}</contextName>
<!--其他配置省略-->
</configuration>
子节点timestamp:
获取时间戳字符串,有两个属性key和datePatten
key:标识此timestamp 的名字;
datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<contextName>${bySecond}</contextName>
3、字节的logger
配置给定 Logger 时不会关闭或删除任何以前引用的追加器
例子:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO"/>
<!-- Strictly speaking, the level attribute is not necessary since -->
<!-- the level of the root level is set to DEBUG by default. -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
以上配置想说明的就是:其他所有类中的日志以debug级别输出,"chapters.configuration"中的日志以info级别输出。
4、子节点appender
元素可以包含零个或一个元素,零个或多个元素和零个或多个元素。除了这三个公共元素之外,元素可以包含任意数量的与 appender 类的 JavaBean 属性相对应的元素。
负责写日志的组件,两个属性name和class。
name指定appender名称,class指定appender的全限定名 。
1、ConsoleAppender把日志输出控制台。
<!-- 输出全部日志到控制台 -->
class="ch.qos.logback.core.ConsoleAppender"
用例:${ENCODER_PATTERN} 日志打印的格式(后面在说)
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${ENCODER_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
用例含义:把大于等于debug级别的日志输出到控制台。
2、FileAppender:把日志添加到文件。
file:被写入的文件名可以是相对目录,也可以是绝对目录,如果上级目录不存在,会自动创建,没有默认值。
append:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
encoder:对记录事件进行格式化。(具体参数之后在分析 )
prudent:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
<!-- 错误日志:用于将错误日志输出到独立文件 -->
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${BASE_LOG_DIR}/logs/jscc_ccintegration_error.log</file>
<!-- 追加方式记录日志 -->
<append>true</append>
<!-- 日志文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<fileNamePattern>${ENCODER_PATTERN}</fileNamePattern>
<charset>UTF-8</charset>
</encoder>
</appender>
3、RollingFileAppender:滚动记录文件
基于时间TimeBasedRollingPolicy
file:日志输出路径
rollingPolicy:根据时间制定滚动策略。class=“ch.qos.logback.core.rolling.TimeBasedRollingPolicy”
- fileNamePattern:必要节点,如果设置file,可以为活动文件和归档文件设置不同位置,当前日志文件总是记录到指定的文件(活动文件)活动文件的名字不会改变。
如果没有设置file,活动文件的名字会根据fileNamePattern,每隔一段时间改变一次。根据%d{}的格式判断间隔时间。
<!--<rollingPolicy>日志策略,每天建立一个日志文件,或者当天日志文件超过64MB时-->
<fileNamePattern>${LOG_HOME}/log/file/fileLog_info_%d{yyyy-MM-dd}.%i.log</fileNamePattern>-->
<!--<rollingPolicy>日志策略,每分钟简历一个日志文件,或者每分钟日志文件超过64MB时-->
<fileNamePattern>${LOG_HOME}/log/file/fileLog_info_%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
- MaxHistory:假设设置每隔天滚动,下面的配置就是保存最近3天的文件,删除旧文件是,之前归档时创建的目录也会被删除。
<MaxHistory>3</MaxHistory>
用例:按时间策略滚动,设置最长存储时间,文件大小限制。
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${BASE_LOG_DIR}/logs/jscc_ccintegration_error_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日志记录之外,还配置了日志文件不能超过20M,若超过20M,日志文件会以索引0开始,
命名日志文件,例如jsicp-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>3</MaxHistory>
</rollingPolicy>
用例:按大小滚动,文件大小限制,文件存储时长,日志归档文件的总大小。
<configuration>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="ROLLING" />
</root>
</configuration>
append:true,追加方式记录日志
encoder:日志输出格式
filter:按日志等级记录,方便查找。
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
基于大小和时间SizeAndTimeBasedRollingPolicy
<configuration>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="ROLLING" />
</root>
</configuration>
请注意,TimeBasedRollingPolicy已经允许限制归档日志文件的组合大小。如果仅希望限制日志归档文件的总大小,则上述TimeBasedRollingPolicy和设置totalSizeCap属性应足够。
请注意,除了“%d”外,还包括“%i”转换令牌。 %i 和%d 标记都是必需的. 每次当前日志文件在当前时间段结束之前达到 maxFileSize 时,它将以从 0 开始的递增索引进行归档。
基于大小和时间的归档支持删除旧的归档文件。您需要使用 maxHistory 属性指定要保留的周期数。当您的应用程序停止并重新启动时,日志记录将在正确的位置 continue 进行,即在当前期间以最大的索引号进行记录。
四、logback的日志名称问题
logge日志的名称只能以logback开头。
例子:logback-xxx.xml
我们可以通过读源码发现,项目初始化的时候,会拿到以logback开头的配置文件,将你取名字及后缀去掉,然后拼接spring+文件类型。
AbstractLoggingSystem
--getSpringInitializationConfig
protected String[] getSpringConfigLocations() {
String[] locations = this.getStandardConfigLocations();
for(int i = 0; i < locations.length; ++i) {
String extension = StringUtils.getFilenameExtension(locations[i]);
locations[i] = locations[i].substring(0, locations[i].length() - extension.length() - 1) + "-spring." + extension;
}
return locations;
}
---------------------
LogbackLoggingSystem
protected String[] getStandardConfigLocations() {
return new String[]{"logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml"};
}