0

我正在使用Spring Boot(1.5.4)。我希望通過JSON格式而不是純文本將來自我的服務的(logback)日誌通過RabbitMQ發送到Logstash。這將使我不必在Logstash端設置過濾器,以便可以在應用程序端控制格式(使用Logback編碼器)。使用JSON編碼器(Spring)通過RabbitMQ發送Logback日誌到LogStash

我知道Spring的logback AMQP Appender for RabbitMQ org.springframework.amqp.rabbit.logback.AmqpAppender但是這使用了一個Layout(純文本)而不是格式化的JSON。我想使用LogStash編碼器net.logstash.logback.encoder.LogstashEncoder。我想用追加程序與編碼器(我想這一切:「)

回答

0

我第一次延長AMQPAppender添加編碼器,像這樣: - 。

package nz.govt.mpi.util; 

import org.springframework.amqp.core.Message; 
import org.springframework.amqp.rabbit.logback.AmqpAppender; 

import ch.qos.logback.classic.spi.ILoggingEvent; 
import ch.qos.logback.core.encoder.Encoder; 
import lombok.Getter; 
import lombok.Setter; 

public class AmqpLogbackAppender extends AmqpAppender { 

    @Getter 
    @Setter 
    private Encoder<ILoggingEvent> encoder; 

    /** 
    * We remove the default message layout and replace with the JSON {@link Encoder} 
    */ 
    @Override 
    public Message postProcessMessageBeforeSend(Message message, Event event) { 
     return new Message(this.encoder.encode(event.getEvent()), message.getMessageProperties()); 
    } 

    @Override 
    public void start() { 
     super.start(); 
     encoder.setContext(getContext()); 

     if (!encoder.isStarted()) { 
      encoder.start(); 
     } 

    } 

    @Override 
    public void stop() { 
     super.stop(); 
     encoder.stop(); 
    } 

} 

然後我設置的logback像這樣-spring.xml配置文件: -

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <springProperty scope="context" name="rabbitMQHost" source="logback.amqp.host" defaultValue="localhost"/> 
    <springProperty scope="context" name="rabbitMQPort" source="logback.amqp.port" defaultValue="5672"/> 
    <springProperty scope="context" name="rabbitMQUsername" source="spring.rabbitmq.username" /> 
    <springProperty scope="context" name="rabbitMQPassword" source="spring.rabbitmq.password" /> 
    <springProperty scope="context" name="rabbitMQExchangeName" source="logback.amqp.exchange.name" defaultValue="mpi.tradedev"/> 
    <springProperty scope="context" name="rabbitMQRoutingKey" source="logback.amqp.routing.key" defaultValue="mpi.tradedev.logging"/> 
    <springProperty scope="context" name="serviceName" source="spring.application.name" /> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread, %X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="AMQP" class="nz.govt.mpi.util.AmqpLogbackAppender"> 
     <!-- layout is required but ignored as using the encoder for the AMQP message body --> 
     <layout><pattern><![CDATA[ %level ]]></pattern></layout> 

     <encoder class="net.logstash.logback.encoder.LogstashEncoder"> 
      <customFields>{"serviceName": "${serviceName}"}</customFields> 
     </encoder> 

    <!-- RabbitMQ connection --> 
    <host>${rabbitMQHost}</host> 
    <port>${rabbitMQPort}</port> 
    <username>${rabbitMQUsername}</username> 
    <password>${rabbitMQPassword}</password> 
    <exchangeName>${rabbitMQExchangeName}</exchangeName> 
    <routingKeyPattern>${rabbitMQRoutingKey}</routingKeyPattern> 

    <declareExchange>true</declareExchange> 
    <exchangeType>topic</exchangeType> 
    <generateId>true</generateId> 
    <charset>UTF-8</charset> 
    <durable>true</durable> 
    <deliveryMode>PERSISTENT</deliveryMode> 

</appender> 

    <root level="info"> 
     <appender-ref ref="STDOUT" /> 
     <appender-ref ref="AMQP" /> 
    </root> 
</configuration> 

我最後加入所需的屬性的文件application.properties像這樣: -

spring.application.name=my-app 
logback.amqp.host=localhost 
logback.amqp.port=5672 
logback.amqp.exchange.name=ex_logstash 
logback.amqp.routing.key=my-app.logging 
spring.rabbitmq.username=rquser 
spring.rabbitmq.password=rqpass 

我還必須在RabbitMQ中設置必要的用戶帳戶。當應用程序運行時,它會創建主題(ex_logstash),但必須使用路由鍵匹配(my-app。*)創建綁定到該主題的隊列(qu_logstash)。 然後,您創建一個logstash配置以匹配隊列名稱。

ex_logstash - > qu_logstash

logstash.json配置文件示例: -

input { 
    rabbitmq { 
    host => "localhost" 
    queue => "qu_logstash" 
    durable => true 
    exchange => "ex_logstash" 
    key => "my-app.*" 
    threads => 10 
    type => "topic" 
    prefetch_count => 200 
    port => 5672 
    user => "rquser" 
    password => "rqpass" 
    } 
} 

在應用程序方面在你的pom.xml您需要所需的依賴關係。這些是我正在使用的涵蓋所需類別YMMV: -

<dependency> 
     <groupId>org.springframework.cloud</groupId> 
     <artifactId>spring-cloud-starter-stream-rabbit</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>net.logstash.logback</groupId> 
     <artifactId>logstash-logback-encoder</artifactId> 
     <version>4.9</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <scope>provided</scope> 
    </dependency> 
相關問題