Spring-boot使用-logback
进行日志记录
前言:
Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。
为什么使用logback?, logback有什么优点:
- 内核重写、测试充分、初始化内存加载更小,这一切让logback性能和log4j相比有诸多倍的提升
- logback非常自然地直接实现了slf4j,这个严格来说算不上优点,只是这样,再理解slf4j的前提下会很容易理解logback,也同时很容易用其他日志框架替换logback
- logback当配置文件修改了,支持自动重新加载配置文件,扫描过程快且安全,它并不需要另外创建一个扫描线程
- 支持自动去除旧的日志文件,可以控制已经产生日志文件的最大数量
如果要使用LogBack,原则上是需要添加dependency依赖的
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
但是因为新建的Spring Boot项目一般都会引用
spring-boot-starter
或者spring-boot-starter-web
,而这两个起步依赖中都已经包含了对于spring-boot-starter-logging
的依赖,所以,无需额外添加依赖。Spring Boot默认的日志级别为INFO,这里打印的是INFO级别的日志所以可以显示。
1.- 简单使用
SpringBootLogbackApplication.java
/**
* <p>
* 启动类
* </p>
*/
@SpringBootApplication
@Slf4j // 在需要使用到日记的地方使用>>>>Slf4j注解(前提是引入了Lombok依赖与安装插件)
public class SpringBootLogbackApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringBootLogbackApplication.class, args);
int length = context.getBeanDefinitionNames().length;
log.trace("Spring boot启动初始化了 {} 个 Bean", length);
log.debug("Spring boot启动初始化了 {} 个 Bean", length);
log.info("Spring boot启动初始化了 {} 个 Bean", length);
log.warn("Spring boot启动初始化了 {} 个 Bean", length);
log.error("Spring boot启动初始化了 {} 个 Bean", length);
try {
int i = 0;
int j = 1 / i;
} catch (Exception e) {
log.error("【SpringBootLogbackApplication】启动异常:", e);
}
}
}
2.- 将日志输出为文件
默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.yml中设置logging.file或logging.path属性。例如:
logging: path: ${spring.application.name} file: ${spring.application.name}.log
它们不会同时生效,只配置其中一个就好了!
如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件。
如果只配置 logging.path,会在项目的当前路径下生成一个文件夹里面生成一个日志文件为 spring.log
3.- 级别输出控制
可以控制日志输出级别,可以全局,也可以指定文件夹! 例如:
logging: level: root: debug #root使用debug级别输出 --------------指定文件夹输出 `↓` ----------- logging: level: com.chenzhihao: info #指定文件夹输出
4. - 自定义日志配置
一般情况下,我们都是需要自定义日志配置来满足项目的需要;
SpringBoot
官方推荐优先使用带有-spring
的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml
的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项。上面是默认的命名规则,并且
resources
资源目录下面即可。如果想自定义命名,需要在
application.yml
上加上配置:
logging.config= classpath:${spring.application.name}-config.xml
最为普通的输出到控制台:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定义有颜色的日记输出格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) --- %cyan(%msg%n)"/>
<!--服务名称-->
<property name="APP_NAME" value="${spring.application.name}"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 定义级别并引入自定义appender-->
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
如果要输出到文件: 则添加多一个
<appender>
标签并定义属性, 然后在<root>
根标签引入例如:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定义有颜色的日记输出格式 -->
.......
<!--应用名称-->
<property name="APP_NAME" value="eureka-client"/>
<!--日志存储文件夹名-->
<property name="LOG_FILE_PATH" value="logss"/>
<!-- 控制台属性 -->
.........
<!--日志输出为文件-->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 级别的日志,就只允许INFO 其他过滤-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!--匹配到就允许-->
<onMatch>ACCEPT</onMatch>
<!--没有匹配到就禁止-->
<onMismatch>DENY</onMismatch>
</filter>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:这是活动文件的大小,默认值是10MB -->
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 输出格式 -->
<encoder>
<pattern>%date [%thread] %-5level [%logger{100}] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
</appender>
<!-- 定义级别并引入自定义appender-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/> <!-- 引入输入文件appender-->
</root>
</configuration>
5. - 当配置文件更改时,自动加载
configuration
标签上属性介绍
为了让 logback 能够在配置文件改变的时候自动去扫描,需要在 ``configuration
标签上添加
scan=true属性。 例如:
`默认情况下,一分钟扫描一次配置文件,看是否有更改。通过
configuration
标签上的scanPeriod
属性可以指定扫描周期。扫描周期的时间单位可以是毫秒、秒、分钟或者小时。30 seconds
注意:如果没有指定时间单位,则默认为毫秒。
当设置了
scan="true"
,会新建一个ReconfigureOnChangeTask
任务用于监视配置文件是否变化。ReconfigureOnChangeTask
也会自动监视外部文件的变化。如果更改后的配置文件有语法错误,则会回退到之前的配置文件。
通过
configuration
标签上的debug属性:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false
6.- 标签说明
<
configuration
>标签属性上面已经说了!
根标签属性一:contextName
设置上下文名称
<contextName>mylogback</contextName>
每个logger都关联到logger上下文,默认上下文名称为
“default”
。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。
根标签属性二:property
设置变量
<property name="log.path" value="log" />
**用来定义变量值的标签,有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使
${}
------“${log.path}”`来使用变量。
子标签节点一: appender
:
appender
用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略ConsoleAppender
和文件输出策略rolling.RollingFileAppender
。输出控制台与文件输出策略看上面例子。
日志格式:
%d{HH: mm:ss.SSS}
——日志输出时间。%thread
——输出日志的进程名字,这在Web应用以及异步任务处理中很有用。%-5level
——日志级别,并且使用5个字符靠左对齐。%logger{36}
——日志输出者的名字。%msg
——日志消息。%n
——平台的换行符。
文件输出策略,重要的是rollingPolicy
的定义:
TimeBasedRollingPolicy
是最常用的轮转策略。它是基于时间来定义轮转策略。例如按天或者按月。其他策略这里就不介绍了。
FileNamePattern
-------${xxxxx}/logback.%d{yyyy-MM-dd}.log
定义了日志的切分方式——把每一天的日志归档到一个文件中;maxHistory
-----30
表示只保留最近30天的日志,以防止日志填满整个磁盘空间。同理,可以使用%d{yyyy-MM-dd_HH-mm}
来定义精确到分的日志切分方式;totalSizeCap
------1GB
用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。使用这个属性时还需要设置 maxHistory 属性。而且,maxHistory 将会被作为第一条件,该属性作为第二条件。maxFileSize
日志文件达到了 指定的大小,会进行归档,递增索引从 0 开始。- 如果没有
File
属性,那么只会使用FileNamePattern
的文件路径规则如果同时有和,那么当天日志是,明天会自动把今天的日志改名为今天的日期。即, 的日志都是当天的。
子节点二: root
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性,用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。
默认是DEBUG。可以包含零个或多个元素,标识这个appender将会添加到这个logger。
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
</root>
子节点三: logger
<logger>
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定。
仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name
:用来指定受此logger约束的某一个包或者具体的某一个类。
level
:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。
addtivity
:是否向上级logger传递打印信息。默认是true。<!-- 选择输出sql文件夹或者单独一个类或者文件夹:包路径--> <logger name="com.macro.mall.mapper" level="DEBUG"></logger>
logback
每天生成和大小生成冲突的问题可以看这个解答
个人demo配置好logback.xml
的:
拿上修修改改即可使用!
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定义有颜色的日记输出格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) --- %cyan(%msg%n)"/>
<!-- 定义文件日记输出格式 -->
<property name="FILE_LOG_PATTERN"
value="%date [%thread] %-5level [%logger{100}] %file:%line - %msg%n"/>
<!--应用名称-->
<property name="APP_NAME" value="eureka-client"/>
<!--日志存储文件夹名-->
<property name="LOG_FILE_PATH" value="logss"/>
<!-- 控制台属性 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--日志输出为文件-->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 级别的日志,就只允许INFO 其他过滤-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!--匹配到就允许-->
<onMatch>ACCEPT</onMatch>
<!--没有匹配到就禁止-->
<onMismatch>DENY</onMismatch>
</filter>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:这是活动文件的大小,默认值是10MB -->
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 输出格式 -->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
</appender>
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 级别的日志,就只允许Error 其他过滤-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-error.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 WARN 级别的日志,就只允许WARN 其他过滤-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern><FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-warn.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern></FileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 定义级别并引入自定义appender-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="FILE_WARN"/>
</root>
<!-- 选择输出sql文件夹或者单独一个类或者文件夹:全路径-->
<logger name="com.chenzhihao.dao" level="DEBUG"></logger>
</configuration>
日志颜色: