如何为Quarkus访问日志设置文件大小限制
Quarkus访问日志文件大小限制配置方案
Quarkus官方没有提供直接配置访问日志文件大小限制的属性,但可以通过以下两种方案实现日志滚动,避免文件无限增大:
方案一:通过日志框架实现滚动访问日志
这种方案利用Quarkus默认集成的日志框架(Logback/JBoss Logging)的滚动策略,配置更灵活且无需编写代码:
- 修改
application.properties,禁用默认的Undertow文件访问日志,改为输出到日志框架:
quarkus.http.access-log.enabled=false quarkus.http.access-log.log-to-logging=true
- 在
src/main/resources/logback.xml中添加访问日志专属的滚动文件Appender,配置大小、备份数量等规则:
<appender name="ACCESS_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/access.log</file> <!-- 基于大小+时间的滚动策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <maxFileSize>100MB</maxFileSize> <!-- 单个日志文件最大100MB --> <maxHistory>30</maxHistory> <!-- 保留最近30天的日志文件 --> <totalSizeCap>1GB</totalSizeCap> <!-- 所有日志文件总大小不超过1GB --> <fileNamePattern>logs/access.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <!-- 归档日志命名规则,自动压缩 --> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern> </encoder> </appender>
- 在logback.xml中添加访问日志的Logger配置,指定使用上面的Appender:
<logger name="io.quarkus.http.access-log" level="INFO" additivity="false"> <appender-ref ref="ACCESS_LOG"/> </logger>
方案二:自定义Undertow访问日志Handler(原生滚动实现)
如果希望直接使用Undertow原生的文件滚动逻辑,可以编写自定义Bean来注册带大小限制的访问日志Handler:
- 先禁用默认访问日志:
quarkus.http.access-log.enabled=false
- 创建一个CDI Producer类,生成配置了大小滚动的AccessLogHandler:
import io.undertow.server.handlers.accesslog.AccessLogHandler; import io.undertow.server.handlers.accesslog.FileAccessLogReceiver; import io.undertow.server.handlers.accesslog.SizeRotatingFileOutputStream; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; import java.io.File; @ApplicationScoped public class CustomAccessLogProducer { @Produces public AccessLogHandler customAccessLogHandler() throws Exception { // 初始化带大小限制的输出流:单个文件100MB,最多保留5个备份 SizeRotatingFileOutputStream rotatingStream = new SizeRotatingFileOutputStream( new File("logs/access.log"), 100 * 1024 * 1024, // 100MB 5, // 备份文件数量 false // 不追加到现有文件(根据需求调整) ); FileAccessLogReceiver logReceiver = new FileAccessLogReceiver(rotatingStream); // 自定义访问日志格式,可参考quarkus.http.access-log.pattern的默认值 String logPattern = "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\""; return new AccessLogHandler(exchange -> {}, logReceiver, logPattern); } }
方案对比
- 方案一:配置简单,支持时间+大小双重滚动、日志压缩、总大小限制等高级特性,推荐大多数场景使用。
- 方案二:完全基于Undertow原生实现,不依赖日志框架配置,适合需要精细控制Undertow访问日志行为的场景。
内容的提问来源于stack exchange,提问作者Paweł Nowakowski
相关产品推荐
相关产品推荐

