diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/LoggingEventListener.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/LoggingEventListener.java index 5e2078812..e6f5f71de 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/LoggingEventListener.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/LoggingEventListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2016 the original author or authors. + * Copyright 2011-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,13 +15,15 @@ */ package org.springframework.data.mongodb.core.mapping.event; +import static org.springframework.data.mongodb.core.query.SerializationUtils.*; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationListener; /** * {@link ApplicationListener} for Mongo mapping events logging the events. - * + * * @author Jon Brisbin * @author Martin Baumgartner * @author Oliver Gierke @@ -31,7 +33,7 @@ public class LoggingEventListener extends AbstractMongoEventListener { private static final Logger LOGGER = LoggerFactory.getLogger(LoggingEventListener.class); - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener#onBeforeConvert(org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent) */ @@ -40,57 +42,57 @@ public class LoggingEventListener extends AbstractMongoEventListener { LOGGER.info("onBeforeConvert: {}", event.getSource()); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener#onBeforeSave(org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent) */ @Override public void onBeforeSave(BeforeSaveEvent event) { - LOGGER.info("onBeforeSave: {}, {}", event.getSource(), event.getDocument()); + LOGGER.info("onBeforeSave: {}, {}", event.getSource(), serializeToJsonSafely(event.getDocument())); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener#onAfterSave(org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent) */ @Override public void onAfterSave(AfterSaveEvent event) { - LOGGER.info("onAfterSave: {}, {}", event.getSource(), event.getDocument()); + LOGGER.info("onAfterSave: {}, {}", event.getSource(), serializeToJsonSafely(event.getDocument())); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener#onAfterLoad(org.springframework.data.mongodb.core.mapping.event.AfterLoadEvent) */ @Override public void onAfterLoad(AfterLoadEvent event) { - LOGGER.info("onAfterLoad: {}", event.getDocument()); + LOGGER.info("onAfterLoad: {}", serializeToJsonSafely(event.getDocument())); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener#onAfterConvert(org.springframework.data.mongodb.core.mapping.event.AfterConvertEvent) */ @Override public void onAfterConvert(AfterConvertEvent event) { - LOGGER.info("onAfterConvert: {}, {}", event.getDocument(), event.getSource()); + LOGGER.info("onAfterConvert: {}, {}", serializeToJsonSafely(event.getDocument()), event.getSource()); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener#onAfterDelete(org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent) */ @Override public void onAfterDelete(AfterDeleteEvent event) { - LOGGER.info("onAfterDelete: {}", event.getDocument()); + LOGGER.info("onAfterDelete: {}", serializeToJsonSafely(event.getDocument())); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener#onBeforeDelete(org.springframework.data.mongodb.core.mapping.event.BeforeDeleteEvent) */ @Override public void onBeforeDelete(BeforeDeleteEvent event) { - LOGGER.info("onBeforeDelete: {}", event.getDocument()); + LOGGER.info("onBeforeDelete: {}", serializeToJsonSafely(event.getDocument())); } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/LoggingEventListenerTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/LoggingEventListenerTests.java new file mode 100644 index 000000000..5b15adaa0 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/LoggingEventListenerTests.java @@ -0,0 +1,99 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.core.mapping.event; + +import static org.hamcrest.core.StringStartsWith.*; +import static org.junit.Assert.*; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; + +import org.bson.Document; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.LoggerFactory; + +/** + * @author Christoph Strobl + */ +public class LoggingEventListenerTests { + + LoggingEventListener listener; + ListAppender appender; + + @Before + public void setUp() { + + // set log level for LoggingEventListener to "info" and set up an appender capturing events. + ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory + .getLogger(LoggingEventListener.class); + logger.setLevel(Level.toLevel("info")); + + appender = new ListAppender(); + logger.addAppender(appender); + appender.start(); + + listener = new LoggingEventListener(); + } + + @Test // DATAMONGO-1645 + public void shouldSerializeAfterConvertEventCorrectly() { + + listener.onAfterConvert(new AfterConvertEvent(new Document("foo", new Foo()), this, "collection")); + + assertThat(appender.list.get(0).getFormattedMessage(), startsWith("onAfterConvert: { \"foo\"")); + } + + @Test // DATAMONGO-1645 + public void shouldSerializeBeforeSaveEventEventCorrectly() { + + listener.onBeforeSave(new BeforeSaveEvent(new Foo(), new Document("foo", new Foo()), "collection")); + + assertThat(appender.list.get(0).getFormattedMessage(), + startsWith("onBeforeSave: org.springframework.data.mongodb.core.")); + } + + @Test // DATAMONGO-1645 + public void shouldSerializeAfterSaveEventEventCorrectly() { + + listener.onAfterSave(new AfterSaveEvent(new Foo(), new Document("foo", new Foo()), "collection")); + + assertThat(appender.list.get(0).getFormattedMessage(), + startsWith("onAfterSave: org.springframework.data.mongodb.core.")); + } + + @Test // DATAMONGO-1645 + public void shouldSerializeBeforeDeleteEventEventCorrectly() { + + listener.onBeforeDelete(new BeforeDeleteEvent(new Document("foo", new Foo()), Object.class, "collection")); + + assertThat(appender.list.get(0).getFormattedMessage(), startsWith("onBeforeDelete: { \"foo\"")); + } + + @Test // DATAMONGO-1645 + public void shouldSerializeAfterDeleteEventEventCorrectly() { + + listener.onAfterDelete(new AfterDeleteEvent(new Document("foo", new Foo()), Object.class, "collection")); + + assertThat(appender.list.get(0).getFormattedMessage(), startsWith("onAfterDelete: { \"foo\"")); + } + + static class Foo { + + } + +}