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

ini 复制代码
<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属性指定哪个配置文件接受配置。可以使用逗号分隔列表指定多个配置文件。

ini 复制代码
<!--
    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 配置文件

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 {

java 复制代码
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/...

less 复制代码
 [ 转载文章](https://blog.51cto.com/u_16213675/9284356)
相关推荐
MZ_ZXD00122 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东25 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology30 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble34 分钟前
springboot的核心实现机制原理
java·spring boot·后端
人道领域42 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
CodeToGym2 小时前
【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出
java·apache·excel
凡人叶枫2 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
发现一只大呆瓜2 小时前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
JMchen1232 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio