[CAMEL-6694] lookup logger in registry when single instance available
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/f5f8a10e Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/f5f8a10e Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/f5f8a10e Branch: refs/heads/camel-2.12.x Commit: f5f8a10e72c617add1a3ab3bb5c04fa00b679f20 Parents: 043449c Author: Grzegorz Grzybek <gr.grzy...@gmail.com> Authored: Thu Apr 3 12:51:18 2014 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Apr 4 08:39:49 2014 +0200 ---------------------------------------------------------------------- .../camel/component/log/LogComponent.java | 19 ++- .../component/log/LogCustomLoggerTest.java | 147 +++++++++++++++++++ 2 files changed, 163 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/f5f8a10e/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java b/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java index b3dc3a7..5eebc25 100644 --- a/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java +++ b/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java @@ -22,13 +22,16 @@ import java.util.Map; import org.apache.camel.Endpoint; import org.apache.camel.LoggingLevel; import org.apache.camel.Processor; +import org.apache.camel.ResolveEndpointFailedException; import org.apache.camel.impl.UriEndpointComponent; import org.apache.camel.processor.CamelLogProcessor; import org.apache.camel.processor.DefaultExchangeFormatter; import org.apache.camel.processor.ThroughputLogger; import org.apache.camel.spi.ExchangeFormatter; +import org.apache.camel.util.CamelContextHelper; import org.apache.camel.util.CamelLogger; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * The <a href="http://camel.apache.org/log.html">Log Component</a> @@ -37,22 +40,32 @@ import org.slf4j.Logger; * @version */ public class LogComponent extends UriEndpointComponent { + private static final Logger LOG = LoggerFactory.getLogger(LogComponent.class); private ExchangeFormatter exchangeFormatter; public LogComponent() { super(LogEndpoint.class); } - + protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { LoggingLevel level = getLoggingLevel(parameters); Logger providedLogger = getLogger(parameters); + if (providedLogger == null) { + // try to look up the logger in registry + Map<String, Logger> availableLoggers = getCamelContext().getRegistry().findByTypeWithName(Logger.class); + if (availableLoggers.size() == 1) { + providedLogger = availableLoggers.values().iterator().next(); + } else if (availableLoggers.size() > 1) { + LOG.info("More than one {} instance found in the registry. Falling back to creating logger from URI {}.", Logger.class.getName(), uri); + } + } LogEndpoint endpoint = new LogEndpoint(uri, this); endpoint.setLevel(level.name()); setProperties(endpoint, parameters); - CamelLogger camelLogger = null; + CamelLogger camelLogger = null; if (providedLogger == null) { camelLogger = new CamelLogger(remaining, level, endpoint.getMarker()); } else { @@ -66,7 +79,7 @@ public class LogComponent extends UriEndpointComponent { Long groupDelay = endpoint.getGroupDelay(); logger = new ThroughputLogger(camelLogger, this.getCamelContext(), endpoint.getGroupInterval(), groupDelay, groupActiveOnly); } else { - // first, try to use the user-specified formatter (or the one picked up from the Registry and transferred to + // first, try to use the user-specified formatter (or the one picked up from the Registry and transferred to // the property by a previous endpoint initialisation); if null, try to pick it up from the Registry now ExchangeFormatter localFormatter = exchangeFormatter; if (localFormatter == null) { http://git-wip-us.apache.org/repos/asf/camel/blob/f5f8a10e/camel-core/src/test/java/org/apache/camel/component/log/LogCustomLoggerTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/component/log/LogCustomLoggerTest.java b/camel-core/src/test/java/org/apache/camel/component/log/LogCustomLoggerTest.java new file mode 100644 index 0000000..7114f53 --- /dev/null +++ b/camel-core/src/test/java/org/apache/camel/component/log/LogCustomLoggerTest.java @@ -0,0 +1,147 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.log; + +import org.apache.camel.CamelContext; +import org.apache.camel.ContextTestSupport; +import org.apache.camel.ResolveEndpointFailedException; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.impl.PropertyPlaceholderDelegateRegistry; +import org.apache.camel.impl.SimpleRegistry; +import org.apache.log4j.*; +import org.apache.log4j.spi.LoggingEvent; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.LoggerFactory; + +import java.io.StringWriter; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +/** + * Custom Logger test. + */ +public class LogCustomLoggerTest extends ContextTestSupport { + + // to capture the logs + private static StringWriter sw1; + // to capture the warnings from LogComponent + private static StringWriter sw2; + + private static class CapturingAppender extends AppenderSkeleton { + private StringWriter sw; + + private CapturingAppender(StringWriter sw) { + this.sw = sw; + } + + @Override + protected void append(LoggingEvent event) { + this.sw.append(event.getLoggerName()); + } + + @Override + public void close() { + } + + @Override + public boolean requiresLayout() { + return false; + } + } + + @Before @Override + public void setUp() throws Exception { + super.setUp(); + sw1 = new StringWriter(); + sw2 = new StringWriter(); + Logger.getLogger(LogCustomLoggerTest.class).removeAllAppenders(); + Logger.getLogger(LogCustomLoggerTest.class).addAppender(new CapturingAppender(sw1)); + Logger.getLogger(LogCustomLoggerTest.class).setLevel(Level.TRACE); + Logger.getLogger("provided.logger1.name").removeAllAppenders(); + Logger.getLogger("provided.logger1.name").addAppender(new CapturingAppender(sw1)); + Logger.getLogger("provided.logger1.name").setLevel(Level.TRACE); + Logger.getLogger("provided.logger2.name").removeAllAppenders(); + Logger.getLogger("provided.logger2.name").addAppender(new CapturingAppender(sw1)); + Logger.getLogger("provided.logger2.name").setLevel(Level.TRACE); + Logger.getLogger("irrelevant.logger.name").removeAllAppenders(); + Logger.getLogger("irrelevant.logger.name").addAppender(new CapturingAppender(sw1)); + Logger.getLogger("irrelevant.logger.name").setLevel(Level.TRACE); + Logger.getLogger(LogComponent.class).removeAllAppenders(); + Logger.getLogger(LogComponent.class).addAppender(new CapturingAppender(sw2)); + Logger.getLogger(LogComponent.class).setLevel(Level.TRACE); + } + + @Test + public void testFallbackLogger() throws Exception { + String endpointUri = "log:" + LogCustomLoggerTest.class.getCanonicalName(); + template.requestBody(endpointUri, "hello"); + assertThat(sw1.toString(), equalTo(LogCustomLoggerTest.class.getCanonicalName())); + } + + @Test + public void testEndpointURIParametrizedLogger() throws Exception { + getRegistry().put("logger1", LoggerFactory.getLogger("provided.logger1.name")); + getRegistry().put("logger2", LoggerFactory.getLogger("provided.logger2.name")); + template.requestBody("log:irrelevant.logger.name?logger=#logger2", "hello"); + assertThat(sw1.toString(), equalTo("provided.logger2.name")); + } + + @Test + public void testEndpointURIParametrizedNotResolvableLogger() { + getRegistry().put("logger1", LoggerFactory.getLogger("provided.logger1.name")); + try { + template.requestBody("log:irrelevant.logger.name?logger=#logger2", "hello"); + } catch (ResolveEndpointFailedException e) { + // expected + } + } + + @Test + public void testDefaultRegistryLogger() throws Exception { + getRegistry().put("logger", LoggerFactory.getLogger("provided.logger1.name")); + template.requestBody("log:irrelevant.logger.name", "hello"); + assertThat(sw1.toString(), equalTo("provided.logger1.name")); + } + + @Test + public void testTwoRegistryLoggers() throws Exception { + getRegistry().put("logger1", LoggerFactory.getLogger("provided.logger1.name")); + getRegistry().put("logger2", LoggerFactory.getLogger("provided.logger2.name")); + template.requestBody("log:irrelevant.logger.name", "hello"); + assertThat(sw1.toString(), equalTo("irrelevant.logger.name")); + assertThat(sw2.toString(), equalTo(LogComponent.class.getName())); + } + + @Override + protected CamelContext createCamelContext() throws Exception { + return new DefaultCamelContext(new SimpleRegistry()); + } + + private SimpleRegistry getRegistry() { + SimpleRegistry registry = null; + if (context.getRegistry() instanceof PropertyPlaceholderDelegateRegistry) { + registry = (SimpleRegistry) ((PropertyPlaceholderDelegateRegistry) context.getRegistry()).getRegistry(); + } else { + fail("Could not determine Registry type"); + } + return registry; + } + +}