logback 设置的totalSizeCap属性没效果

1. 描述

totalSizeCap属性设置了, 但没有效果,文件总大小超出后没进行删除旧文件。

  • 配置:
	<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
           <FileNamePattern>${LOG_PATH}_error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
           <totalSizeCap>30KB</totalSizeCap>
           <maxFileSize>5KB</maxFileSize>
           <cleanHistoryOnStart>true</cleanHistoryOnStart>
	</rollingPolicy>
  • 环境
IDE: 2021.3
spring boot: 2.5.6 (spring-boot-starter-logging: 2.5.6 --- logback-classic: 1.2.6)
2. 问题
  • 日志文件总大小超出,设置值后没清除旧的日志文件。
    在这里插入图片描述
  • 原因:
    在这里插入图片描述
    在这里插入图片描述

3. 解决

  • 设置maxHistory属性值
   <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
          <FileNamePattern>${LOG_PATH}_error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
          <maxHistory>30</maxHistory>
          <totalSizeCap>30KB</totalSizeCap>
          <maxFileSize>5KB</maxFileSize>
          <cleanHistoryOnStart>true</cleanHistoryOnStart>
   </rollingPolicy>
  • 结果:
    在这里插入图片描述

4. 资料

logback 手册appender标签totalSizeCap属性说明:https://logback.qos.ch/manual/appenders.html

这是我目前的文件,怎么改造才会打印<configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml" /> <property name="log.pattern" value="%d{yyyy/MM/dd-HH:mm:ss} %-5level [%-21thread][%X{traceId}] %logger{36} %line - %msg%n"/> <!--定义参数,后面可以通过${APP_NAME}使用--> <property name="APP_NAME" value="start" /> <property name="LOG_PATH" value="${user.home}/${APP_NAME}/logs" /> <property name="LOG_FILE" value="${LOG_PATH}/application.log" /> <appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--定义日志输出的路径--> <file>${LOG_FILE}</file> <encoder> <pattern>${log.pattern}</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxHistory>7</maxHistory> <maxFileSize>50MB</maxFileSize> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> </appender> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${log.pattern}</pattern> <charset>utf8</charset> </encoder> </appender> <!--rootLogger是默认的logger--> <root level="INFO"> <!--定义了两个appender,日志会通过往这两个appender里面写--> <appender-ref ref="CONSOLE" /> <appender-ref ref="APPLICATION" /> </root> <!--应用日志--> <!--这个logger有指定appender,它会继承root节点中定义的那些appender--> <logger name="feign" level="DEBUG" /> <logger name="feign.Logger" level="DEBUG" /> <logger name="feign.okhttp.OkHttpClient" level="DEBUG" /> <logger name="com.example" level="DEBUG"/> <!-- <logger name="com.mycloud.alibaba.mapper" level="debug"/>--> <logger name="com.alibaba.nacos.client" level="ERROR"/> <logger name="io.github.resilience4j.common.circuitbreaker" level="DEBUG"/> <logger name="io.github.resilience4j.circuitbreaker" level="DEBUG"/> <logger name="io.github.resilience4j.circuitbreaker.internal" level="DEBUG"/> <logger name="com.alibaba.cloud.sentinel" level="INFO"/> <logger name="com.alibaba.csp.sentinel.property" level="INFO"/> <logger name="com.alibaba.csp.sentinel.slots.system" level="INFO"/> <logger name="com.alibaba.csp.sentinel.transport" level="INFO"/> <!--数据库日志--> <!--由于这个logger自动继承了root的appender,root中已经有stdout的appender了,自己这边又引入了stdout的appender--> <!--如果设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况--> <!--additivity表示要不要使用rootLogger配置的appender进行输出--> <!-- <logger name="com.apache.ibatis" level="debug" additivity="false">--> <!-- <appender-ref ref="CONSOLE"/>--> <!-- </logger>--> </configuration>
最新发布
06-17
<think>我们正在使用Logback来配置日志,目标是打印出特定格式的Sentinel日志,例如:[Sentinel]Loadingdegraderules:/api/orders[Sentinel]Systemruleloaded:highestCpuUsage=0.9根据用户的需求,我们需要调整logback.xml配置文件,特别是<configuration>部分,以便能够打印出这种格式的日志。分析:1.我们需要确保Sentinel相关的日志能够被记录,并且以指定的格式输出。2.Sentinel的日志通常由特定的Logger(如`com.alibaba.csp.sentinel`)产生,因此我们需要配置这些Logger的级别和输出格式。3.用户已经提到当前配置包含appender、logger和rollingPolicy设置,所以我们需要调整的主要是logger的配置以及输出格式(pattern)。步骤:1.确定需要记录日志的包:根据Sentinel的日志输出,我们知道这些日志是由Sentinel内部的类打印的。通常,这些类在`com.alibaba.csp.sentinel`包及其子包下。因此,我们可以配置这个包的日志级别为DEBUG(因为规则加载日志通常是DEBUG级别)。2.配置日志输出格式:在appender的encoder中,我们可以通过pattern来定义日志的输出格式。但是,注意用户要求输出的日志格式是:[Sentinel]Loadingdegraderules:/api/orders这种格式有时间戳、线程名等其他信息,只有方括号中的标签和消息。但是,通常我们会在日志中保留一些基本信息(如时间),但用户要求的是特定格式,所以我们可以有两种选择:a)为Sentinel日志单独配置一个appender,使用特定的pattern,只输出消息本身(不包含时间、线程等)。b)在现有的appender中调整pattern,但这样会影响所有日志。所以更推荐第一种。然而,用户要求的是在原有配置基础上调整,所以我们可以考虑新增一个appender专门用于Sentinel日志,或者修改现有appender的pattern。但用户可能希望保留其他日志的格式不变,只改变Sentinel日志?但注意,日志格式是在appender上统一的,同一个appender输出的日志格式相同。因此,如果我们要改变Sentinel日志的格式,就需要将其分离到单独的appender。3.配置logger:将Sentinel相关的logger(如`com.alibaba.csp.sentinel`)定向到我们配置的appender,并设置适当的日志级别。具体配置建议:方案一:为Sentinel日志单独配置一个appender,只输出消息内容(即不包含时间戳等),这样就能得到和用户要求完全一致的格式。方案二:如果用户希望保留原有日志格式,那么就不需要改变pattern,但是这样输出的日志就会包含时间戳等信息,例如:2023-08-1514:30:25.123[main]DEBUGcom.alibaba.csp.sentinel.property-[Sentinel]Loadingdegraderules:/api/orders但用户要求的是:[Sentinel]Loadingdegraderules:/api/orders所以,为了完全匹配,我们采用方案一。配置示例:在logback.xml中,我们可以添加如下配置:1.添加一个专门用于Sentinel日志的appender,并设置pattern只输出消息(%msg)和换行(%n):```xml<appendername="SENTINEL_APPENDER"class="ch.qos.logback.core.ConsoleAppender"><!--或者也可以使用FileAppender,这里以控制台为例--><encoder><pattern>%msg%n</pattern></encoder></appender>```2.然后,将Sentinel的logger指向这个appender,并设置级别为DEBUG(因为规则加载日志在DEBUG级别):```xml<loggername="com.alibaba.csp.sentinel"level="DEBUG"additivity="false"><appender-refref="SENTINEL_APPENDER"/></logger>```注意:`additivity="false"`是为了避免日志被重复输出到其他appender(比如rootlogger的appender)。但是,这样配置后,所有来自`com.alibaba.csp.sentinel`包的日志都会以这种格式输出。如果用户希望同时保留其他日志的完整格式(带时间戳等),而只有Sentinel日志是这种简洁格式,那么这样配置是可行的。然而,我们注意到用户示例中的日志行首有[Sentinel]标签,这个标签实际上是日志内容的一部分,是由Sentinel代码中打印日志时自己加上的。所以我们的pattern只需要输出消息(%msg)即可,因为[Sentinel]已经是消息的一部分。但是,如果用户希望将Sentinel日志输出到单独的文件,我们可以使用FileAppender,并配置滚动策略。综合以上,下面是一个完整的配置示例(在原有配置基础上修改):```xml<configuration><!--其他原有配置...--><!--新增一个专门用于Sentinel日志的Appender,输出到控制台--><appendername="SENTINEL_CONSOLE"class="ch.qos.logback.core.ConsoleAppender"><encoder><!--只输出消息内容,不加任何额外信息--><pattern>%msg%n</pattern></encoder></appender><!--或者输出到文件,并设置滚动策略--><appendername="SENTINEL_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/sentinel.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>logs/sentinel.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%msg%n</pattern></encoder></appender><!--配置Sentinel的Logger,可以同时输出到控制台和文件,也可以只选一个--><loggername="com.alibaba.csp.sentinel"level="DEBUG"additivity="false"><appender-refref="SENTINEL_CONSOLE"/><appender-refref="SENTINEL_FILE"/></logger><!--其他原有配置...--></configuration>```这样配置后,所有来自`com.alibaba.csp.sentinel`包(及其子包)的DEBUG级别及以上的日志,都会以这种简洁格式输出到控制台和文件。而其他日志不受影响。但是,需要注意的是,Sentinel打印规则加载日志的类可能不在同一个包下。根据经验,规则加载的日志通常由`com.alibaba.csp.sentinel.property`包下的类打印,系统规则由`com.alibaba.csp.sentinel.slots.system`包下的类打印。因此,更精确的配置是:```xml<loggername="com.alibaba.csp.sentinel.property"level="DEBUG"additivity="false"><appender-refref="SENTINEL_CONSOLE"/><appender-refref="SENTINEL_FILE"/></logger><loggername="com.alibaba.csp.sentinel.slots.system"level="DEBUG"additivity="false"><appender-refref="SENTINEL_CONSOLE"/><appender-refref="SENTINEL_FILE"/></logger>```这样,只有这两个包的日志会以简洁格式输出。但是,如果用户希望捕获所有以`[Sentinel]`开头的日志,而不管来自哪个包,那么上述配置就不够了。这种情况下,我们可以使用自定义过滤器(Filter)来检查日志消息,只输出以`[Sentinel]`开头的日志,并改变其格式。但这样比较复杂,且可能影响性能。因此,推荐使用包路径配置,因为Sentinel的日志输出类都是已知的。如果用户不确定具体是哪些类,可以将logger的name设置为`com.alibaba.csp.sentinel`,这样该包下的所有日志都会捕获。最后,注意日志级别:规则加载日志在DEBUG级别,所以确保将logger的级别设置为DEBUG。根据引用[2]中,用户已经设置了logging.level.com.example.sentineldemo:DEBUG,但这只是应用包的日志级别。对于Sentinel,我们需要设置其包的日志级别。因此,在logback.xml中配置logger是直接有效的方式。总结调整部分:1.新增一个或多个appender,使用pattern为`%msg%n`。2.新增logger,指定为Sentinel相关的包,并设置级别为DEBUG,关联新增的appender,并设置additivity=false。这样,当Sentinel打印规则加载日志时,就会按照我们指定的格式输出。如果用户希望同时保留原有格式的日志(即其他日志不变),那么这样做是可行的。注意:如果用户希望将Sentinel日志同时输出到原来的appender(带完整格式)和新增的appender(简洁格式),那么不要设置additivity=false,而是设置为true(默认就是true),然后同时关联两个appender。但是这样会导致每条日志被输出两次:一次是完整格式,一次是简洁格式。所以通常我们设置additivity=false来避免重复。因此,根据用户需求选择即可。如果用户只需要在控制台看到简洁格式的Sentinel日志,那么只配置一个控制台的appender即可。相关问题:1.如何配置Logback将不同包的日志输出到不同的文件?2.Logback中additivity属性的作用是什么?3.如何动态修改Logback的日志级别?4.Sentinel规则加载日志的级别是什么?5.如何配置Logback的过滤器(Filter)来过滤特定消息?</think>### Logback 配置实现 Sentinel 特定格式日志输出 要打印类似 `[Sentinel] Loading degrade rules: /api/orders` 格式的日志,需要调整 Logback 配置中的以下部分: #### 关键修改点(logback.xml) ```xml <configuration> <!-- 1. 修改 Pattern 格式 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- 添加 %msg 格式符确保原始消息完整输出 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 2. 配置 Sentinel 专用 Logger --> <logger name="com.alibaba.csp.sentinel" level="DEBUG" additivity="false"> <appender-ref ref="CONSOLE"/> <!-- 可添加文件输出 --> <appender-ref ref="FILE"/> </logger> <!-- 3. 确保规则加载包被记录 --> <logger name="com.alibaba.csp.sentinel.property" level="DEBUG"/> <logger name="com.alibaba.csp.sentinel.slots.system" level="DEBUG"/> </configuration> ``` #### 关键配置说明: 1. **%msg 格式符** 在 `<pattern>` 中添加 `%msg` 确保 Sentinel 原始日志消息(如 `[Sentinel] Loading...`)不被修改地完整输出[^2]。 2. **Sentinel 专用 Logger** - `com.alibaba.csp.sentinel` 包捕获所有 Sentinel 日志 - `level="DEBUG"` 确保规则加载日志可见(默认 INFO 不显示规则详情) - `additivity="false"` 避免重复输出到 root logger 3. **特定规则包** - `com.alibaba.csp.sentinel.property`:规则加载核心包 - `com.alibaba.csp.sentinel.slots.system`:系统规则(含 CPU 使用率)包 #### 配合 Spring Boot 的配置(application.yml) ```yaml logging: level: com.alibaba.csp.sentinel: DEBUG # 启用 Sentinel 详细日志[^2] com.alibaba.csp.sentinel.property: DEBUG com.alibaba.csp.sentinel.slots.system: DEBUG ``` #### 输出效果示例 ``` 2023-08-15 14:30:25.123 [main] DEBUG c.a.c.s.property - [Sentinel] Loading degrade rules: /api/orders 2023-08-15 14:30:25.456 [Sentinel-timer] DEBUG c.a.c.s.slots.system - [Sentinel] System rule loaded: highestCpuUsage=0.9 ``` #### 验证方式 1. 启动时观察日志: ```bash grep "Loading degrade rules" application.log ``` 2. 动态修改规则后检查: ```bash tail -f application.log | grep 'highestCpuUsage' ``` ### 相关问题 1. 如何在 Spring Boot 中动态调整 Sentinel 的日志级别? 2. Logback 的 `additivity=false` 配置有什么作用? 3. 如何将 Sentinel 日志输出到独立文件? 4. `highestCpuUsage=0.9` 中的 0.9 表示什么含义? 5. 为什么规则加载日志需要 DEBUG 级别才能显示? 6. 如何通过 Nacos 动态更新 Sentinel 规则配置?[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值