Springboot logback日志配置
一、读取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 中的属性,示例如下:
application.properties配置 spring.profiles.active=loc log.url=/auditLogs/
logback-spring.xml配置
<springProperty scope="context" name="LOG_HOME" source="log.url" />
<property name="LOG_APP_HOME" value="${LOG_HOME}/app"/>
<property name="LOG_ERROR_HOME" value="${LOG_HOME}/error"/>
<property name="LOG_DEBUG_HOME" value="${LOG_HOME}/debug"/>
二、加载指定的配置模块
java logback中如何配置显示请求路径和参数 logback获取spring值 blog.51cto.com/u_16213675/… 二、加载指定的配置模块 中的name,读取的是 spring.profiles.active配置项的值。
标签允许更加灵活配置文件,使用该name属性指定哪个配置文件接受配置。可以使用逗号分隔列表指定多个配置文件。
<!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能设置为INHERITED或者同义词NULL。默认是DEBUG
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-->
<springProfile name="loc">
<logger name="com.gaiaworks" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</springProfile>
<springProfile name="d">
<logger name="com.example" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="APP" />
<appender-ref ref="APP_ERROR" />
<appender-ref ref="APP_DEBUG" />
</root>
</springProfile>
<springProfile name="p">
<logger name="com.example" level="INFO"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="APP" />
<appender-ref ref="APP_ERROR" />
</root>
</springProfile>
三、完整的 logback-spring.xml 配置文件
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<springProperty scope="context" name="LOG_HOME" source="log.url" />
<property name="LOG_APP_HOME" value="${LOG_HOME}/app"/>
<property name="LOG_ERROR_HOME" value="${LOG_HOME}/error"/>
<property name="LOG_DEBUG_HOME" value="${LOG_HOME}/debug"/>
<!-- 彩色日志 -->
<!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 -->
<!-- magenta:洋红 -->
<!-- boldMagenta:粗红-->
<!-- cyan:青色 -->
<!-- white:白色 -->
<!-- magenta:洋红 -->
<!-- 彩色日志控制台输出 -->
<property name="CONSOLE_LOG_PATTERN"
value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>
<!-- 控制台输出 -->
<!-- level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--日志文档输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<!-- 本地控制台输出的时候,可以使用彩色打印日志 -->
<!-- <pattern>${CONSOLE_LOG_PATTERN}</pattern> -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!--设置字符集-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<!-- 时间滚动输出 level大于或等于 INFO 级别的日志信息 -->
<appender name="APP" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<!--
日志记录器的滚动策略
SizeAndTimeBasedRollingPolicy 按日期,大小记录日志
另外一种方式:
rollingPolicy的class设置为ch.qos.logback.core.rolling.TimeBasedRollingPolicy
-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名 i%:当单个文件达到最大时,自动新增0,1,2... ${POD_NAME}:在k8s中是为了辨别是哪个pod的日志文件-->
<FileNamePattern>${LOG_APP_HOME}/audit.log.%d{yyyy-MM-dd}.%i-${POD_NAME}.log</FileNamePattern>
<!--单个文件达到最大 1000MB 时会被切割和压缩 -->
<!--配置日志文件不能超过100M,若超过100M,日志文件会以索引0开始,上面%i会显示索引的数字-->
<maxFileSize>1000MB</maxFileSize>
<!--日志文件保留天数-->
<MaxHistory>20</MaxHistory>
<!--总大小-->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!--设置字符集-->
<charset>UTF-8</charset>
</encoder>
<!-- 此日志文件记录大于或等于 info 级别的日志信息 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
</filter>
</appender>
<appender name="APP_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_ERROR_HOME}/audit-error.log.%d{yyyy-MM-dd}.%i-${POD_NAME}.log</FileNamePattern>
<MaxFileSize>10MB</MaxFileSize>
<!--日志文件保留天数-->
<MaxHistory>7</MaxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的日志级别 -->
<level>ERROR</level>
<!--匹配到就允许-->
<onMatch>ACCEPT</onMatch>
<!--没有匹配到就禁止-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="APP_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_DEBUG_HOME}/audit-debug.log.%d{yyyy-MM-dd}.%i-${POD_NAME}.log</FileNamePattern>
<MaxFileSize>10MB</MaxFileSize>
<!--日志文件保留天数-->
<MaxHistory>7</MaxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 此日志文件只记录DEBUG级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。
addtivity:是否向上级logger传递打印信息。默认是true。
<logger name="org.springframework.web" level="info"/>
<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
-->
<!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能设置为INHERITED或者同义词NULL。默认是DEBUG
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-->
<springProfile name="loc">
<logger name="com.gaiaworks" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</springProfile>
<springProfile name="d">
<logger name="com.example" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="APP" />
<appender-ref ref="APP_ERROR" />
<appender-ref ref="APP_DEBUG" />
</root>
</springProfile>
<springProfile name="p">
<logger name="com.example" level="INFO"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="APP" />
<appender-ref ref="APP_ERROR" />
</root>
</springProfile>
四、本地进行测试
1、创建一个 logback-spring.xml 文件,将上面粘贴到该文件中来
2、创建两个 properties 文件
application.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级别
java logback中如何配置显示请求路径和参数 logback获取spring值 blog.51cto.com/u_16213675/…
[ 转载文章](https://blog.51cto.com/u_16213675/9284356)
转载自:https://juejin.cn/post/7329699974915162148