Spring Boot日志配置logback

2023-10-31

目录

一、logback介绍

1.logback定义

2.logback启动加载文件

3.pom依赖 

3.日志级别

二、配置文件详解

1.configuration

2.property

3.springProperty

4.logger

5.root

6.appender

7.AsyncAppender

三.Spring Boot配置

完整logback-spring.xml配置文件


一、logback介绍

1.logback定义

Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch

logback的结构主要由三个模块组成:

  1. logback-core:其它两个模块的基础模块。
  2. logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。
  3. logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能。

SLF4J 是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。大概意思是指你只需要按统一的方式写记录日志的代码,而无需关心日志是通过哪个日志系统,以什么风格输出的,因为它们取决于部署项目时绑定的日志系统。

SLF4J最常用的日志实现框架是:log4j、logback。一般有slf4j+log4j、slf4j+log4j2、slf4j+logback三种日志组合。

本文选取logback做具体介绍

2.logback启动加载文件

在工程resources目录下建立logback.xml

  1. logback首先会试着查找logback.groovy文件;
  2. 当没有找到时,继续试着查找logback-test.xml文件;
  3. 当没有找到时,继续试着查找logback.xml文件;
  4. 如果仍然没有找到,则使用默认配置(打印到控制台)。

注:Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件

3.pom依赖 

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

<!--引入以上依赖,会自动引入以下jar
	logback-classic.x.x.x.jar
	logback-core.x.x.x.jar
	slf4j-api-x.x.x.jar
-->

注:在实际开发中我们不需要直接添加该依赖,spring-boot-starter其中包含了spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架就是logback。而spring-boot-starter-web包含了spring-boot-starter,可通过引入spring-boot-starter-web后的项目JAR依赖关系很快得出这个结论。

3.日志级别

日志级别用来控制日志信息的输出,从高到低分为共分为七个等级:

  1. off 最高等级,用于关闭所有日志记录。
  2. fatal 指出每个严重的错误事件将会导致应用程序的退出。
  3. error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
  4. warm 表明会出现潜在的错误情形。
  5. info 一般和在粗粒度级别上,强调应用程序的运行全程。
  6. debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
  7. all 最低等级,用于打开所有日志记录。

Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG,优先级高的将被打印出来。(logback通用),通过定义级别,可以作为应用程序中相应级别的日志信息的开关。

二、配置文件详解

1.configuration

  1. scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
  2. scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
  3. debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <!-- 其他配置省略-->  
</configuration>

2.property

property有两个属性name和value:name变量的名称,value变量的值。

   <!-- logback项目名称 -->
    <property name="appName" value="demoServer"></property>

    <!-- 日志级别 DEBUGER INFO WARN ERROR -->
    <property name="logLevel" value="INFO"></property>

    <!-- 日志路径-->
    <property name="logPath" value="/data/project/logs"></property>

    <!-- 最大保存时间 60天-->
    <property name="maxHistory" value="60"/>

    <!-- 异步缓冲队列的深度,该值会影响性能.默认值为256 -->
    <property name="queueSize" value="512"></property>

    <!-- lOGGER  PATTERN 根据个人喜好选择匹配  -->
    <property name="logPattern" value="[ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{36} [%line] [%thread]- %msg%n"></property>

3.springProperty

springProperty要配合配置文件来用。

    <springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
    <springProperty scope="context" name="spring.profiles.active" source="spring.profiles.active"/>

也就是在配置文件中有对应配置。 

spring:
  application:
    name: demoServer
  profiles:
    active: dev

4.logger

logger节点,可选节点,作用是指明具体的包或类的日志输出级别,以及要使用的<appender>(可以把<appender>理解为一个日志模板)。

  1. name:必写属性,指定具体包或类,被指定的包或类中的日志输出将遵从该logger规定配置。
  2. level:非必写属性,指定日志输出级别,该级别将覆盖root配置的输出级别。
  3. addtivity:非必写属性,是否向上级loger传递打印信息,默认是true。
  4. appender-ref:引用的appender,引用后将实现appender中定义的行为。一个logger可以有多个引用,互不影响。
    <logger name="com.github.demo" level value="INFO" >  
        <!-- 引用的appender,类似于spring的ref -->  
        <appender-ref ref="ASYNC_LOG_INFO" />  
        <appender-ref ref="STDOUT" /> 
    </logger>

 不过一般需要特殊检测的基础服务实际使用中additivity常常设置为false。如下:

    <logger name="com.alibaba.nacos.client" level="${log.level.nacos}" additivity="false">
        <appender-ref ref="ASYNC_THIRD_PARTY_APPENDER"/>
    </logger>

    <logger name="com.alibaba.nacos.client.config" level="${log.level.nacos}" additivity="false">
        <appender-ref ref="ASYNC_THIRD_PARTY_APPENDER"/>
    </logger>

    <logger name="com.alibaba.nacos.client.naming" level="${log.level.nacos}" additivity="false">
        <appender-ref ref="ASYNC_THIRD_PARTY_APPENDER"/>
    </logger>

5.root

root节点,必选节点,用来指定最基础的日志输出级别并指定<appender>,可以理解为根logger。

    <!-- 在定义后引用APPENDER -->
    <root level="${logLevel}">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ASYNC_LOG_DEBUG"/>
        <appender-ref ref="ASYNC_LOG_INFO"/>
        <appender-ref ref="ASYNC_LOG_WARN"/>
        <appender-ref ref="ASYNC_LOG_ERROR"/>
    </root>

6.appender

appender节点是非常关键的一个节点,它有两个必要属性name和class,name指定appender名称,class指定appender的全限定名。

另一个属性encoder:负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。

appender有三种类型:

  1. ConsoleAppender(控制台日志)。
  2. FileAppender(文件日志)。
  3. RollingFileAppender(滚动文件日志)。

最常用的滚动策略,根据时间再根据文件大小来滚动生成文件

    <!-- INFO 级别的日志记录  -->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/info/${appName}_info.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2022-11-06日志,当前写的日志文件路径为file节点指定,
            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2022-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${logPath}/info/${appName}_info-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>128MB</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

把日志输出到控制台

    <!-- lOGGER  PATTERN 根据个人喜好选择匹配  -->
    <property name="logPattern" value="[ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{36} [%line] [%thread]- %msg%n"></property>
    <!-- %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n -->
    <!-- %d{yyyy-MM-dd HH:mm:ss} %-4relative [%thread] %-5level %logger{35} - %msg %n -->
    <!-- [ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{96} [%line] [%thread]- %msg%n  -->

    <!-- 动态日志级别 -->
    <jmxConfigurator/>

    <!-- 控制台的标准输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>

pattern定义了日志的输出格式解析:

  1. %date:表示日期
  2. %thread:表示线程名
  3. %-5level:表示级别从左显示 5 个字符宽度
  4. %logger{36}:表示 Logger 名字最长 36 个字符
  5. %msg:表示日志消息
  6. %n:换行符

7.AsyncAppender

    <!-- ASYNC_LOG_INFO -->
    <appender name="ASYNC_LOG_INFO" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <!-- 设置该属性 logback 会使用 ArrayBlockingQueue 的非阻塞方法 offer 代替 put, 防止在队列满时阻塞业务线程 -->
        <neverBlock>true</neverBlock>
        <appender-ref ref="FILE_INFO"/>
    </appender>
  1. queueSize:控制阻塞队列大小,使用的ArrayBlockingQueue阻塞队列,默认容量256:内存中最多保存256条日志
  2. discardingThreshold:丢弃日志的阈值,为防止队列满后发生阻塞。默认队列剩余容量 < 队列长度的20%,就会丢弃TRACE、DEBUG和INFO级日志
  3. neverBlock:控制队列满时,加入的数据是否直接丢弃,不会阻塞等待,默认是false
    1. 队列满时:offer不阻塞,而put会阻塞
    2. neverBlock为true时,使用offer

注意:

queueSize 过大
可能导致OOM
queueSize 较小
默认值256就已经算很小了,且discardingThreshold设置为大于0(或为默认值),队列剩余容量少于discardingThreshold的配置就会丢弃<=INFO日志。这里的坑点有两个:
因为discardingThreshold,所以设置queueSize时容易踩坑。
neverBlock 默认false
意味总可能会出现阻塞。

  1.  若discardingThreshold = 0,那么队列满时再有日志写入就会阻塞。
  2. 若discardingThreshold != 0,也只丢弃≤INFO级日志,出现大量错误日志时,还是会阻塞。

queueSize、discardingThreshold和neverBlock三参密不可分,务必按业务需求设置:

  1. 若优先绝对性能,设置neverBlock = true,永不阻塞。
  2. 若优先绝不丢数据,设置discardingThreshold = 0,即使≤INFO级日志也不会丢。但最好把queueSize设置大一点,毕竟默认的queueSize显然太小,太容易阻塞。
  3. 若兼顾,可丢弃不重要日志,把queueSize设置大点,再设置合理的discardingThreshold

三.Spring Boot配置

Spring Boot项目的配置文件。

logging:
  file:
    path: '@logging.file.path@'
    name: ${logging.file.path}/${spring.application.name}/root.log
  config: classpath:logback-spring.xml

spring-boot-starter-web默认引入logback

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

完整logback-spring.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 分级别异步文件日志输出配置 -->
<!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- logback项目名称 -->
    <property name="appName" value="demoServer"></property>

    <!-- 日志级别 DEBUGER INFO WARN ERROR -->
    <property name="logLevel" value="INFO"></property>

    <!-- 日志路径-->
    <property name="logPath" value="/data/project/logs"></property>

    <!-- 最大保存时间 60天-->
    <property name="maxHistory" value="60"/>

    <!-- 异步缓冲队列的深度,该值会影响性能.默认值为256 -->
    <property name="queueSize" value="512"></property>

    <!-- lOGGER  PATTERN 根据个人喜好选择匹配  -->
    <property name="logPattern" value="[ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{36} [%line] [%thread]- %msg%n"></property>
    <!-- %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n -->
    <!-- %d{yyyy-MM-dd HH:mm:ss} %-4relative [%thread] %-5level %logger{35} - %msg %n -->
    <!-- [ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{96} [%line] [%thread]- %msg%n  -->

    <!-- 动态日志级别 -->
    <jmxConfigurator/>

    <!-- 控制台的标准输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>

    <!-- DUBUG 日志记录  -->
    <appender name="FILE_DEBUG"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/debug/${appName}_debug.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2022-11-06日志,当前写的日志文件路径为file节点指定,
            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2022-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${logPath}/debug/${appName}_debug-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>128MB</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- INFO 级别的日志记录  -->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/info/${appName}_info.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2022-11-06日志,当前写的日志文件路径为file节点指定,
            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2022-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${logPath}/info/${appName}_info-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>128MB</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--  WARN 级别的日志记录 -->
    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/warn/${appName}_warn.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2022-11-06日志,当前写的日志文件路径为file节点指定,
            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2022-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${logPath}/warn/${appName}_warn-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>128MB</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- Error 级别的日志记录 -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/error/${appName}_error.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2022-11-06日志,当前写的日志文件路径为file节点指定,
            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2022-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${logPath}/error/${appName}_error-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>128MB</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- ASYNC_LOG_DEBUG  -->
    <appender name="ASYNC_LOG_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <!-- 设置该属性 logback 会使用 ArrayBlockingQueue 的非阻塞方法 offer 代替 put, 防止在队列满时阻塞业务线程 -->
        <neverBlock>true</neverBlock>
        <appender-ref ref="FILE_DEBUG"/>
    </appender>

    <!-- ASYNC_LOG_INFO -->
    <appender name="ASYNC_LOG_INFO" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <!-- 设置该属性 logback 会使用 ArrayBlockingQueue 的非阻塞方法 offer 代替 put, 防止在队列满时阻塞业务线程 -->
        <neverBlock>true</neverBlock>
        <appender-ref ref="FILE_INFO"/>
    </appender>

    <!-- ASYNC_LOG_WARN -->
    <appender name="ASYNC_LOG_WARN" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <!-- 设置该属性 logback 会使用 ArrayBlockingQueue 的非阻塞方法 offer 代替 put, 防止在队列满时阻塞业务线程 -->
        <neverBlock>true</neverBlock>
        <appender-ref ref="FILE_WARN"/>
    </appender>

    <!--ASYNC_LOG_ERROR  -->
    <appender name="ASYNC_LOG_ERROR" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <!-- 设置该属性 logback 会使用 ArrayBlockingQueue 的非阻塞方法 offer 代替 put, 防止在队列满时阻塞业务线程 -->
        <neverBlock>true</neverBlock>
        <appender-ref ref="FILE_ERROR"/>
    </appender>

    <logger name="com.github.demo" level value="DEBUG" additivity="false">  
        <!-- 引用的appender,类似于spring的ref -->  
        <appender-ref ref="STDOUT" /> 
    </logger>

    <!-- 在定义后引用APPENDER -->
    <root level="${logLevel}">
        <appender-ref ref="ASYNC_LOG_DEBUG"/>
        <appender-ref ref="ASYNC_LOG_INFO"/>
        <appender-ref ref="ASYNC_LOG_WARN"/>
        <appender-ref ref="ASYNC_LOG_ERROR"/>
    </root>
</configuration>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot日志配置logback 的相关文章

  • Logback 从根目录中排除记录器

    我有几个打包好的 想单独记录
  • logback.xml 并从 JetBrains IDEA IDE 运行应用程序

    我在IDEA中开发应用程序时 logback xml应该放在哪里才能对应用程序产生影响 当您运行 调试 IDEA 时 似乎不会生成任何 jar 也不会调用 Maven 来构建某些内容 它是否直接从编译的 class 文件执行 main 如果
  • 使用 JAR 加载 log4j.properties [重复]

    这个问题在这里已经有答案了 我有一个包含以下清单的 jar 文件 Manifest Version 1 0 Created By 1 7 0 07 Oracle Corporation Main Class test Main Class
  • 使用 Logback 屏蔽密码?

    目前 我们一般都会记录进出系统的所有 XML 文档 其中一些文档包含明文密码 我们希望能够配置执行此操作的 logback 记录器 附加程序来进行一些模式匹配或类似操作 并且如果它检测到存在密码则将其替换 最有可能使用星号 请注意 我们不想
  • 为什么选择 XML 而不是属性文件来进行 Log4J 配置?

    是否有任何理由在 Log4J 配置中使用 XML 而不是属性文件 有一个有趣的讨论这篇博客中两者的优点 http www laliluna de log4j tutorial html 以下部分摘自该博客 属性可以由属性文件或 XML 文件
  • Log4j RollingFileAppender 未将映射器和减速器日志添加到文件中

    我们希望将应用程序日志打印到本地节点上的文件中 我们使用 Log4j 的 RollingFileAppender Our log4j properties文件如下 ODS LOG DIR var log appLogs ODS LOG IN
  • 将 System.out.println 记录到单个应用程序的日志文件

    我们在 tomcat 上有多个应用程序 它们使用 System out println 语句记录到 catalina out 有一个应用程序会创建大量日志语句 因此我想将这些应用程序输出记录到单独的日志文件中 我创建了一个 log4j xm
  • 如何使 Fluent-logger-java 在 Spring Boot 中与 logback Appender 一起工作

    我正在尝试将 fluid logger java 与带有 logback 附加程序的 springboot 项目集成 我可以使用中给出的示例代码将数据发送到 fluidd 聚合器https github com Fluent Fluent
  • 停止自定义 logback 异步附加程序的正确方法

    我使用 Amazon 的 Java SDK 创建了 Amazon SQS 和 SNS logback 附加程序 基本附加程序使用同步 Java API 但我还通过扩展创建了两者的异步版本ch qos logback classic Asyn
  • 如何在 log4j 中启用包级别日志记录

    谁能告诉我 log4j 中的包级别日志记录是什么 以及如何实现这一点 今天我的面试问题无法回答 即使我在谷歌中也没有找到好的解决方案 太感谢了 包级别日志记录是 log4j 的标准日志记录 使用 log4j 配置 您可以指定包和关联的级别
  • Log4J 仅将一个类附加到附加程序

    我需要定期轮询正在运行的应用程序的 JVM 内存统计信息 我正在运行一个服务来执行此操作并将统计信息写入根记录器 我对根记录器的使用与否没有太多控制权 我想要做的是将这些日志消息路由到单个附加程序 该附加程序应该只处理来自该类的日志消息 而
  • 如何缓解 Apache Log4j 反序列化 RCE (CVE-2019-17571)

    我已将 log4j core 依赖项升级到 2 15 0 以防止任何潜在的 Log4Shell 攻击 话虽如此 我无法从 1 2 17 升级 slf4j log4j12 的间接 log4j 依赖项 因为 slf4j log4j12 的最新稳
  • Maven 记录器的 SLF4J 桥

    我正在编写 Maven 3 x 插件 并想使用 SLF4J 和 Logback 进行日志记录 我发现了 Maven Logger 的一些 SLF4J 绑定 http www jcabi com jcabi maven slf4j index
  • 并发 log4j

    我有自己的日志引擎 它将日志写入带有阻塞队列的单独线程上 为了使用 标准软件 我正在考虑切换到 log4j 我不希望我的高并发软件因日志命令而变慢 这些日志命令在调用命令时将所有内容写入磁盘 log4j 可以用作垃圾箱吗 Log4j 是大多
  • Log4j 显示包名称

    现在对于我的 ConversionPattern 我有 log4j appender A1 layout ConversionPattern d yyyy MMM dd HH mm ss SSS 5p t F L m n 我想做的还包括包含
  • Logback 附加程序将消息作为 HTTP 消息发布

    根据我的要求 我只想将 HTTP 消息发布到另一端 该消息由org slf4j LoggerFactory getLogger 以下 JSON 字符串记录在INFO level studentName My Name Deratment C
  • Spring Boot logback.xml 创建 .tmp 文件

    我正在尝试保留 Spring Boot 应用程序的日志 但是 由于生成的日志很大 我正在尝试使用 logback xml 将大于 350MB 的文件滚动到压缩文件中 我每天可以滚动几 MB 但中途服务开始写入临时文件 我已经尝试了 Time
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果

随机推荐

  • protobuf生成prototxt文件

    使用protobuf可以分为以下几步 1 proto文件的定义 在这个文件中定义了最终生成的prototxt格式 举个例子如下所示 syntax proto2 package label proto message DetectLabel
  • scrapy缺点

    Scrapy 是一个功能强大的网络爬虫框架 但也有一些缺点 Scrapy 只能爬取静态网页 无法爬取动态网页 Scrapy 只能爬取一个网站的数据 无法爬取多个网站的数据 Scrapy 需要编写代码 对于那些不会编写代码的人来说可能会有些困
  • LiteOS内存管理

    1 内存管理简介 内存管理模块管理系统的内存资源 它是操作系统的核心模块之一 主要包括内存的初始化 分配以及释放 在系统运行过程中 内存管理模块通过对内存的申请 释放操作 来管理用户和OS对内存的使用 使内存的利用率和使用效率达到最优 同时
  • obs无法连接服务器?PotPlayer获取不到视频

    搭建基于nginx的rtmp直播服务器 https hywlovexyc info blog archives 572 rtmp server listen 1935 监听的端口 chunk size 4000 application yu
  • 删除中间节点

    题目 若链表中的某个节点 既不是链表头节点 也不是链表尾节点 则称其为该链表的 中间节点 假定已知链表的某一个中间节点 请实现一种算法 将该节点从链表中删除 例如 传入节点 c 位于单向链表 a gt b gt c gt d gt e gt
  • sqlserver查看数据表结构

    可以通过两种方式 1 sp help 表名 2 sp columns 表名
  • 我的世界服务器config文档,Essentials/配置文件/config.yml

    ops name color none nickname prefix max nick length 15 change displayname true change playerlist true add prefix suffix
  • Unity--虚拟轴

    1 查看虚拟轴 Edit gt project settings gt Input 2 获取虚拟轴 input GetAxis 用法 GetAxis Mouse X GetAxis Mouse Y GetAxis Mouse ScrollW
  • centos7Linux中的lvm、pv、vg、lv,以及Linux扩容,创建新分区

    概念 本着言简意赅的目的 以下概念会在扩容时用到 需熟知 不然会不理解具体操作在干什么 lvm 逻辑卷管理器 Logical Volume Manager 它使系统管理员可以更方便的为应用与用户分配存储空间 在LVM管理下的存储卷可以按需要
  • QT信号槽原理(一)connect函数

    目录 2个类型和1个签名 Qt ConnectionType QMetaMethod MethodType 方法签名 connect函数源码解析 函数原型 第一步 参数检查 第二步 获取信号和槽的index 第三步 检查信号和槽的参数是否匹
  • Opencv之图像固定阈值二值化处理threshold

    目录 一 图像二值化 二 threshold 三 代码 一 图像二值化 定义 图像的二值化 就是将图像上的像素点的灰度值设置为0或255 也就是将整个图像呈现出明显的只有黑和白的视觉效果 灰度值0 黑 灰度值255 白 一幅图像包括目标物体
  • Cygwin编译JNI的环境配置

    一 什么是NDK NDK提供了一系列的工具 帮助开发者快速开发C 或C 的动态库 并能自动将so和java应用一起打包成apk 这些工具对开发者的帮助是巨大的 NDK 集成了交叉编译器 并提供了相应的mk文件隔离CPU 平台 ABI 等差异
  • MacBook怎么安装使用Windows软件和虚拟机?

    作为一名MacBook用户 你可能会发现有些软件和应用程序只适用于Windows操作系统 但别担心 今天我们将介绍两种方法 让你的MacBook轻松安装Windows软件和运行Windows虚拟机 为你的工作 学习和娱乐任务带来更多可能性
  • Vue 3 使用 vue-echarts 的柱状图 barItem 和 x, y 轴点击事件实现

    需求背景 最近使用 Vue 3 开发柱状图功能 图表已经绘制完成了 但是突然有需求加进来要可以点击柱状图的柱子 barItem 和 x y 轴的坐标 然后根据点击的位置 处理不同区域的点击事件 作为 CV 程序员 第一时间搜索网上的解决方案
  • 抖音养号步骤有哪些?最重要的3步你做到了吗?

    国仁网络资讯 为大家整理一份超详细的 短视频运营手册 回复私信限时免费领取 有人问我 新手养号怎么养 老账号养号要怎么养 其实 严格来说 养号不分新老 不管你是刚注册的抖音号 还是已经用过很久的抖音号 养号都是运营账号必做的事项之一 那么
  • C++文件的读取详解,以及使用eof出现末行数据被读取两次情况

    目录 0 前言 对文件流的读写 文件打开方式 1 写文本文件 2 读文本文档 2 1使用efo函数判断出现数据被读取两次 3 二进制方式写文件 4 二进制读文件 5 按指定格式读写数据stringstream 0 前言 对文件流的读写 if
  • text/html & text/plain的区别

    需要了解的概念 Content Type 用于定义用户的浏览器或相关设备如何显示将要加载的数据 或者如何处理将要加载的数据 MIME MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型 当该扩展名文件被访问的时候 浏览器会自
  • Red Hat Enterprise Linux 7.9 下载

    1 Red Hat Linux 所有版本 5 6 7 8 9 下载 https pan baidu com s 1eSYuljc2Bt9OXZmWdZQ96A 提取码 cqfu 推荐 https pan baidu com s 1RISly
  • c#:委托与回调函数示例

    c 委托与回调函数示例 上一篇文章已经给大家详细讲解过委托的意思 如何声明定义 如何通过委托调用函数 以及委托中的多播等 今天是刚刚学到委托新的用法 可以将方法当作参数来传递 并且不需用示例委托 所以今天来给大家再次拿出来详细讲解一下 一
  • Spring Boot日志配置logback

    目录 一 logback介绍 1 logback定义 2 logback启动加载文件 3 pom依赖 3 日志级别 二 配置文件详解 1 configuration 2 property 3 springProperty 4 logger