一、读取spring配置文件中的值
logback.xml 早于 application.yml 加载,logback-spring.xml 晚于 application.yml 加载,如果logback 配置需要使用 application.yml 中的属性,需要命名为 logback-spring.xml。
本文中采用 logback-spring.xml 文件来读取配置文件 application-${profile}.properties 中的属性值。 logback需要使用 标签才可使用 application.properties 中的属性,示例如下:
spring.profiles.active=loc
log.url=/auditLogs/
二、加载指定的配置模块
中的name,读取的是 spring.profiles.active配置项的值。
标签允许更加灵活配置文件,使用该name属性指定哪个配置文件接受配置。可以使用逗号分隔列表指定多个配置文件。
三、完整的 logback-spring.xml 配置文件
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${LOG_APP_HOME}/audit.log.%d{yyyy-MM-dd}.%i-${POD_NAME}.log
1000MB
20
20GB
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
UTF-8
INFO
${LOG_ERROR_HOME}/audit-error.log.%d{yyyy-MM-dd}.%i-${POD_NAME}.log
10MB
7
1GB
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
UTF-8
ERROR
ACCEPT
DENY
${LOG_DEBUG_HOME}/audit-debug.log.%d{yyyy-MM-dd}.%i-${POD_NAME}.log
10MB
7
1GB
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
UTF-8
DEBUG
ACCEPT
DENY
四、本地进行测试
1、创建一个 logback-spring.xml 文件,将上面粘贴到该文件中来
2、创建两个 properties 文件
spring.profiles.active=loc
log.url=/auditTestLogs/
- application-loc.properties
server.port=8081
3、写一个测试类
package com.example;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AuditNewTestApplication.class)
class AuditNewTestApplicationTests {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void a3() {
logger.debug("debug日志");
logger.info("info日志");
logger.warn("warn日志");
logger.error("error日志");
}
}
4、运行测试类
5、在本地中查看日志文件夹中的日志
五、遇到的问题及解决办法
1、日志文件为什么要切割?
原因及解决办法:当单个日志量很大的时候,进入该文件中进行查询日志时,会由于文件太大,出现卡死现象,然后导致 k8s 中的 pod 进行重启服务。解决办法:将单个文件大小设置成 500M
2、日志记录的滚动策略 SizeAndTimeBasedRollingPolicy 和 TimeBasedRollingPolicy 的区别?
原因及解决办法:当我用 SizeAndTimeBasedRollingPolicy 但是我没进行将单个文件进行切割和压缩,然后启动项目会报错。解决办法:如果担心日志文件过大,需要切割和压缩文件,用 SizeAndTimeBasedRollingPolicy 。如果不进行切割文件,就用 TimeBasedRollingPolicy。
3、app 文件夹中,日志中想同时记录 INFO 和 ERROR 级别的日志
原因及解决办法:有些人想单个日志文件想同时记录 INFO 和 ERROR 级别的日志,不想将其进行分开。解决办法:将 onMatch 和 onMismatch 标签进行注释掉或者删掉,就能打印出大于或等于 INFO 级别的日志了。
六、总结
- linux中绝对路径中会有三个级别日志的文件夹,app文件夹记录大于或等于INFO级别日志信息,debug文件夹记录DEBUG级别日志,errer文件夹记录ERROR级别日志。dev环境有debug级别日志,test和stage环境和prod环境不记录debug级别日志,因为在logback中没有配置。
- dev、test、stage、prod环境在linux中控制台打印都会输出DEBUG以上的级别日志含DEBUG级别