Skip to content

Commit

Permalink
spring-projectsGH-1014 introduced new parameter serializeMdc for lo…
Browse files Browse the repository at this point in the history
…g4j2 appender to turn on the serialization of MDC into header. by default it turned off

spring-projects#1014
  • Loading branch information
egusev committed Jun 7, 2019
1 parent 3edcd9a commit 1eb4720
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 7 deletions.
Expand Up @@ -183,7 +183,8 @@ public static AmqpAppender createAppender(// NOSONAR NCSS line count
@PluginAttribute("async") boolean async,
@PluginAttribute("charset") String charset,
@PluginAttribute(value = "bufferSize", defaultInt = Integer.MAX_VALUE) int bufferSize,
@PluginElement(BlockingQueueFactory.ELEMENT_TYPE) BlockingQueueFactory<Event> blockingQueueFactory) {
@PluginElement(BlockingQueueFactory.ELEMENT_TYPE) BlockingQueueFactory<Event> blockingQueueFactory,
@PluginAttribute(value = "serializeMdc") boolean serializeMdc) {
if (name == null) {
LOGGER.error("No name for AmqpAppender");
}
Expand Down Expand Up @@ -226,6 +227,7 @@ public static AmqpAppender createAppender(// NOSONAR NCSS line count
manager.clientConnectionProperties = clientConnectionProperties;
manager.charset = charset;
manager.async = async;
manager.serializeMdc = serializeMdc;

BlockingQueue<Event> eventQueue;
if (blockingQueueFactory == null) {
Expand Down Expand Up @@ -283,7 +285,7 @@ protected Message postProcessMessageBeforeSend(Message message, Event event) {
return message;
}

private void sendEvent(Event event, Map<?, ?> properties) {
protected void sendEvent(Event event, Map<?, ?> properties) {
LogEvent logEvent = event.getEvent();
String name = logEvent.getLoggerName();
Level level = logEvent.getLevel();
Expand Down Expand Up @@ -312,8 +314,10 @@ private void sendEvent(Event event, Map<?, ?> properties) {
amqpProps.setTimestamp(tstamp.getTime());

// Copy properties in from MDC
for (Entry<?, ?> entry : properties.entrySet()) {
amqpProps.setHeader(entry.getKey().toString(), entry.getValue());
if (this.manager.serializeMdc) {
for (Entry<?, ?> entry : properties.entrySet()) {
amqpProps.setHeader(entry.getKey().toString(), entry.getValue());
}
}
if (logEvent.getSource() != null) {
amqpProps.setHeader(
Expand All @@ -326,7 +330,7 @@ private void sendEvent(Event event, Map<?, ?> properties) {
doSend(event, logEvent, amqpProps);
}

private void doSend(Event event, LogEvent logEvent, MessageProperties amqpProps) {
protected void doSend(Event event, LogEvent logEvent, MessageProperties amqpProps) {
StringBuilder msgBody;
String routingKey;
try {
Expand Down Expand Up @@ -605,6 +609,11 @@ protected static class AmqpManager extends AbstractManager {
*/
private String charset = Charset.defaultCharset().name();

/**
* Whether or not add MDC properties into message headers. Default is true to keep backward compatibility.
*/
private boolean serializeMdc = true;

private boolean durable = true;

private MessageDeliveryMode deliveryMode = MessageDeliveryMode.PERSISTENT;
Expand Down
Expand Up @@ -154,6 +154,8 @@ public void testProperties() {
assertThat(TestUtils.getPropertyValue(manager, "maxSenderRetries")).isEqualTo(5);
// change the property to true and this fails and test() randomly fails too.
assertThat(TestUtils.getPropertyValue(manager, "async", Boolean.class)).isFalse();
// default value
assertThat(TestUtils.getPropertyValue(manager, "serializeMdc", Boolean.class)).isFalse();

assertThat(TestUtils.getPropertyValue(appender, "events.items", Object[].class).length).isEqualTo(10);

Expand All @@ -168,6 +170,10 @@ public void testAmqpAppenderEventQueueTypeDefaultsToLinkedBlockingQueue() {
Map.class).get("rabbitmq_default_queue");

Object events = TestUtils.getPropertyValue(appender, "events");

Object manager = TestUtils.getPropertyValue(appender, "manager");
assertThat(TestUtils.getPropertyValue(manager, "serializeMdc", Boolean.class)).isTrue();

assertThat(events.getClass()).isEqualTo(LinkedBlockingQueue.class);
}

Expand All @@ -184,6 +190,7 @@ public void testUriProperties() {
assertThat(TestUtils.getPropertyValue(manager, "username")).isNull();
assertThat(TestUtils.getPropertyValue(manager, "password")).isNull();
assertThat(TestUtils.getPropertyValue(manager, "virtualHost")).isNull();
assertThat(TestUtils.getPropertyValue(manager, "serializeMdc", Boolean.class)).isFalse();
}

@Test
Expand Down
6 changes: 4 additions & 2 deletions spring-rabbit/src/test/resources/log4j2-amqp-appender.xml
Expand Up @@ -22,7 +22,8 @@
addresses="localhost:5672"
host="localhost" port="5672" user="guest" password="guest" applicationId="testAppId" charset="UTF-8"
routingKeyPattern="%X{applicationId}.%c.%p"
exchange="log4j2Test_default_queue" deliveryMode="NON_PERSISTENT">
exchange="log4j2Test_default_queue" deliveryMode="NON_PERSISTENT"
serializeMdc="true">
</RabbitMQ>
<RabbitMQ name="rabbitmq_uri"
uri="amqp://guest:guest@localhost:5672/"
Expand All @@ -32,7 +33,8 @@
contentType="text/plain" contentEncoding="UTF-8" generateId="true" deliveryMode="NON_PERSISTENT"
charset="UTF-8"
clientConnectionProperties="bar:foo,baz:qux"
senderPoolSize="3" maxSenderRetries="5">
senderPoolSize="3" maxSenderRetries="5"
serializeMdc="false">
</RabbitMQ>
</Appenders>
<Loggers>
Expand Down

0 comments on commit 1eb4720

Please sign in to comment.