我使用的是Spring Boot(1.5.4)。我希望通过RabbitMQ以JSON格式而不是纯文本将服务中的日志发送到Logstash。这将使我不必在Logstash端设置过滤器,以便可以在应用程序端控制格式化(使用Logback编码器)。
我知道RabbitMQorg.springframework.AMQP.rabbit.logback.amqpappender
的Spring logback AMQP Appender,但是它使用的是布局(纯文本),而不是格式化的JSON。我想使用LogStash编码器net.LogStash.logback.Encoder.logstashencoder
。我想使用与编码器的追加器(我想要它的全部:“)。
我首先扩展了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
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"
}
}
<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>
问题内容: 我有一个生成HTML内容的php脚本。有没有一种方法可以通过php脚本通过JSON将HTML内容发送回我的网页? 问题答案: 是的,您可以使用HTML字符串并根据需要对其进行转义。 请注意,在 JSON中,顶级项 必须 是数组或对象 (现在不再适用) ,不能仅仅是字符串。因此,您将需要创建一个对象并使HTML字符串成为该对象的属性(可能是唯一的属性),因此生成的JSON类似于:
null 谁能给我一个向RabbitMQ发送消息的标准程序的例子。我正在使用Spring Boot,也可以使用它的特性。
我读过许多类似的问题,包括:JQuery、Spring MVC@RequestBody和JSON——使其能够将JSON请求与JQuery/Ajax与Spring一起工作 要求是服务器只会接受应用程序/json类型。我使用的是Spring MVC控制器。代码通过@响应体以JSON形式发送响应。我想通过我的Spring MVC控制器中的@Request estbody获取信息。我正在使用JSP将JSO
问题内容: 我有这样的日志: 我想把他们推到。我正在使用filebeat通过以下配置将数据发送到logstash: 现在使用以下配置,我想更改编解码器类型: 但是,我仍然以字符串格式获取日志: “ message”:“ {\” logId \“:\” 57aaf6c96224b \“,\” clientIp \“:\” 127.0.0.1 \“,\” time \“:\” 03:11:29 pm
我在烧瓶中设置了一个非常简单的帖子路线,如下所示: 这是我试图从命令行发送的curl请求: 但是,它仍然打印出“收到的数据:“无”。所以,它不识别我传递的JSON。 在这种情况下是否需要指定json格式?