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 4676bd792..2117f77a0 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-2013 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,6 +15,8 @@ */ 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; @@ -23,9 +25,10 @@ import com.mongodb.DBObject; /** * {@link ApplicationListener} for Mongo mapping events logging the events. - * + * * @author Jon Brisbin * @author Martin Baumgartner + * @author Christoph Strobl */ public class LoggingEventListener extends AbstractMongoEventListener { @@ -46,7 +49,7 @@ public class LoggingEventListener extends AbstractMongoEventListener { */ @Override public void onBeforeSave(Object source, DBObject dbo) { - LOGGER.info("onBeforeSave: {}, {}", source, dbo); + LOGGER.info("onBeforeSave: {}, {}", source, serializeToJsonSafely(dbo)); } /* @@ -55,7 +58,7 @@ public class LoggingEventListener extends AbstractMongoEventListener { */ @Override public void onAfterSave(Object source, DBObject dbo) { - LOGGER.info("onAfterSave: {}, {}", source, dbo); + LOGGER.info("onAfterSave: {}, {}", source, serializeToJsonSafely(dbo)); } /* @@ -64,7 +67,7 @@ public class LoggingEventListener extends AbstractMongoEventListener { */ @Override public void onAfterLoad(DBObject dbo) { - LOGGER.info("onAfterLoad: {}", dbo); + LOGGER.info("onAfterLoad: {}", serializeToJsonSafely(dbo)); } /* @@ -73,7 +76,7 @@ public class LoggingEventListener extends AbstractMongoEventListener { */ @Override public void onAfterConvert(DBObject dbo, Object source) { - LOGGER.info("onAfterConvert: {}, {}", dbo, source); + LOGGER.info("onAfterConvert: {}, {}", serializeToJsonSafely(dbo), source); } /* @@ -82,7 +85,7 @@ public class LoggingEventListener extends AbstractMongoEventListener { */ @Override public void onAfterDelete(DBObject dbo) { - LOGGER.info("onAfterDelete: {}", dbo); + LOGGER.info("onAfterDelete: {}", serializeToJsonSafely(dbo)); } /* @@ -91,6 +94,6 @@ public class LoggingEventListener extends AbstractMongoEventListener { */ @Override public void onBeforeDelete(DBObject dbo) { - LOGGER.info("onBeforeDelete: {}", dbo); + LOGGER.info("onBeforeDelete: {}", serializeToJsonSafely(dbo)); } } 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..fa2936322 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/LoggingEventListenerTests.java @@ -0,0 +1,102 @@ +/* + * 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.junit.Before; +import org.junit.Test; +import org.slf4j.LoggerFactory; + +import com.mongodb.BasicDBObject; + +/** + * @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 BasicDBObject("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 BasicDBObject("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 BasicDBObject("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 BasicDBObject("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 BasicDBObject("foo", new Foo()), Object.class, "collection")); + + assertThat(appender.list.get(0).getFormattedMessage(), startsWith("onAfterDelete: { \"foo\"")); + } + + static class Foo { + + } + +}