如何设置Spring Boot Undertow服务器访问日志的保留期限?
Spring Boot Undertow 访问日志保留期限/文件数量配置
Spring Boot官方提供的Undertow访问日志配置属性里,确实没有直接设置保留期限或文件数量的选项,但可以通过以下两种方式实现需求:
方式一:自定义Undertow日志滚动策略
Undertow的访问日志默认基于RotatingFileOutputStream实现滚动,我们可以通过自定义UndertowServletWebServerFactory来配置日志的滚动规则,包括保留文件数量:
import io.undertow.server.handlers.accesslog.AccessLogHandler; import io.undertow.server.handlers.accesslog.RotatingFileOutputStream; import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.File; @Configuration public class UndertowAccessLogConfig { @Bean public WebServerFactoryCustomizer<UndertowServletWebServerFactory> accessLogCustomizer() { return factory -> { factory.addDeploymentInfoCustomizers(deploymentInfo -> { deploymentInfo.addInitialHandlerChainWrapper(handler -> { // 日志文件路径,替换为你的实际路径 String logFilePath = "logs/access.log"; // 配置滚动规则:单个日志文件上限10MB,保留10个归档文件,开启压缩 RotatingFileOutputStream outputStream = new RotatingFileOutputStream( new File(logFilePath), 10 * 1024 * 1024, 10, true ); // 日志格式与配置文件中保持一致 return new AccessLogHandler(handler, outputStream, "%h %l %u %t \"%r\" %s %b", AccessLogHandler.DEFAULT_LOGGER_NAME, true); }); }); }; } }
方式二:用外部日志框架(如Logback)接管访问日志
如果项目已使用Logback等日志框架,可以让Undertow将访问日志输出到SLF4J,再通过日志框架的配置控制滚动和保留规则:
1. 修改Spring Boot配置,开启SLF4J输出
在application.properties中添加:
server.undertow.accesslog.enabled=true server.undertow.accesslog.pattern=%h %l %u %t \"%r\" %s %b server.undertow.accesslog.use-slf4j=true
2. 在Logback配置文件(如logback-spring.xml)中添加访问日志Appender
<appender name="UNDERTOW_ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/access.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 归档文件命名规则 --> <fileNamePattern>logs/access.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <!-- 单个日志文件最大容量 --> <maxFileSize>10MB</maxFileSize> <!-- 日志保留天数 --> <maxHistory>30</maxHistory> <!-- 归档文件总大小上限 --> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <!-- 绑定Undertow访问日志的Logger --> <logger name="io.undertow.accesslog" level="INFO" additivity="false"> <appender-ref ref="UNDERTOW_ACCESS"/> </logger>
这种方式灵活性更高,能利用日志框架成熟的滚动策略,支持按时间、大小组合滚动,同时限制总归档大小。
内容的提问来源于stack exchange,提问作者Akash Shinde
相关产品推荐
相关产品推荐

