likes
comments
collection
share

Springboot logback日志配置

作者站长头像
站长
· 阅读数 60

一、读取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
评论
请登录