Quarkus应用配置多Logstash日志输出及按Profile切换方案咨询
可行实现方案
方案一:基于Quarkus Logging GELF扩展实现多Logstash输出+Profile切换
Quarkus的GELF扩展支持配置多个独立的GELF handler实例,并非只能单主机。通过Profile前缀控制不同环境的输出行为:
- 添加依赖(pom.xml)
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-logging-gelf</artifactId> </dependency>
- 在application.properties中配置多环境日志规则
# 通用日志级别配置 quarkus.log.level=INFO # Dev环境:仅启用控制台输出,禁用所有GELF handler %dev.quarkus.log.handler.console.enabled=true %dev.quarkus.log.handler.gelf.*.enabled=false # Prod环境:禁用控制台,启用多个Logstash对应的GELF handler %prod.quarkus.log.handler.console.enabled=false # 第一个Logstash实例配置 %prod.quarkus.log.handler.gelf.logstash1.enabled=true %prod.quarkus.log.handler.gelf.logstash1.host=logstash-host-01 %prod.quarkus.log.handler.gelf.logstash1.port=12201 %prod.quarkus.log.handler.gelf.logstash1.protocol=UDP %prod.quarkus.log.handler.gelf.logstash1.additional-field.app-id=my-quarkus-service # 第二个Logstash实例配置 %prod.quarkus.log.handler.gelf.logstash2.enabled=true %prod.quarkus.log.handler.gelf.logstash2.host=logstash-host-02 %prod.quarkus.log.handler.gelf.logstash2.port=12201 %prod.quarkus.log.handler.gelf.logstash2.protocol=TCP %prod.quarkus.log.handler.gelf.logstash2.additional-field.app-id=my-quarkus-service
每个GELF handler通过gelf.xxx的前缀区分,独立配置目标Logstash主机、协议等参数。
方案二:基于quarkus-logging-logback扩展实现Profile专属配置文件
若需要更复杂的日志格式化规则,可使用Logback扩展,通过Quarkus专属属性指定Profile对应的配置文件(之前无效是因为用了标准Logback属性而非Quarkus的Profile前缀属性):
- 添加依赖(pom.xml)
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-logging-logback</artifactId> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> </dependency>
- 创建Profile专属Logback配置文件
在src/main/resources下创建三个文件:
logback.xml:基础空配置(可选,作为 fallback)logback-dev.xml:Dev环境仅输出到控制台
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration>
logback-prod.xml:Prod环境输出到多个Logstash
<configuration> <!-- 第一个Logstash实例 --> <appender name="LOGSTASH1" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>logstash-host-01:5000</destination> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <timestamp/> <level/> <loggerName/> <message/> <stackTrace/> <mdc/> </providers> </encoder> </appender> <!-- 第二个Logstash实例 --> <appender name="LOGSTASH2" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>logstash-host-02:5000</destination> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <timestamp/> <level/> <loggerName/> <message/> <stackTrace/> <mdc/> </providers> </encoder> </appender> <root level="INFO"> <appender-ref ref="LOGSTASH1"/> <appender-ref ref="LOGSTASH2"/> </root> </configuration>
- 在application.properties中绑定Profile与配置文件
# Dev环境加载logback-dev.xml %dev.quarkus.log.logback.configuration-file=logback-dev.xml # Prod环境加载logback-prod.xml %prod.quarkus.log.logback.configuration-file=logback-prod.xml
注意必须使用Quarkus专属属性quarkus.log.logback.configuration-file,并加上Profile前缀%dev/%prod,而非标准Logback的logback.configurationFile。
内容的提问来源于stack exchange,提问作者Kamilox
相关产品推荐
相关产品推荐

