You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2015/06/15 17:43:54 UTC

svn commit: r1685599 [1/3] - in /qpid/java/trunk: bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/ broker-core/src/main/java/org/apache/qpid/server/logging/ broker-core/src/main/java/org/apache/qpid/server/model/ broker-core/src/ma...

Author: orudyy
Date: Mon Jun 15 15:43:53 2015
New Revision: 1685599

URL: http://svn.apache.org/r1685599
Log:
QPID-6591: [Java Broker] Introduce virtual host logging functionality

Added:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractLogger.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractNameAndLevelFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractVirtualHostLogger.java
      - copied, changed from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/FileLoggerSettings.java
      - copied, changed from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLoggerFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerFilter.java
      - copied, changed from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PrincipalLogEventFilter.java
      - copied, changed from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java
      - copied, changed from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java
      - copied, changed from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilter.java
      - copied, changed from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java
      - copied, changed from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLoggerFilter.java
      - copied, changed from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilterTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/PrincipalLogEventFilterTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/RollingFileAppenderFactoryTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImplTest.java
    qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/VirtualHostLoggerRestTest.java
Removed:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java
Modified:
    qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractBrokerLogger.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerConsoleLoggerImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerMemoryLoggerImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/CompositeFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogRecorder.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLoggerFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Model.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerLoggerTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/CompositeFilterTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java
    qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnection.java
    qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java
    qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java
    qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/ProtocolEngine_1_0_0Test.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
    qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/VirtualHostACLTest.java

Modified: qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java (original)
+++ qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java Mon Jun 15 15:43:53 2015
@@ -19,6 +19,7 @@
 
 package org.apache.qpid.server.virtualhost.berkeleydb;
 
+import java.security.Principal;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -58,6 +59,7 @@ import org.apache.qpid.server.txn.DtxReg
 import org.apache.qpid.server.virtualhost.ExchangeIsAlternateException;
 import org.apache.qpid.server.virtualhost.HouseKeepingTask;
 import org.apache.qpid.server.virtualhost.RequiredExchangeException;
+import org.apache.qpid.server.virtualhost.VirtualHostPrincipal;
 
 /**
   Object that represents the VirtualHost whilst the VirtualHostNode is in the replica role.  The
@@ -68,6 +70,7 @@ public class BDBHAReplicaVirtualHostImpl
 {
     private final StatisticsCounter _messagesDelivered, _dataDelivered, _messagesReceived, _dataReceived;
     private final Broker<?> _broker;
+    private final VirtualHostPrincipal _principal;
 
     @ManagedAttributeField
     private boolean _queue_deadLetterQueueEnabled;
@@ -108,6 +111,7 @@ public class BDBHAReplicaVirtualHostImpl
         _dataDelivered = new StatisticsCounter("bytes-delivered-" + getName());
         _messagesReceived = new StatisticsCounter("messages-received-" + getName());
         _dataReceived = new StatisticsCounter("bytes-received-" + getName());
+        _principal = new VirtualHostPrincipal(this);
         setState(State.UNAVAILABLE);
     }
 
@@ -531,6 +535,12 @@ public class BDBHAReplicaVirtualHostImpl
         return localAddress;
     }
 
+    @Override
+    public Principal getPrincipal()
+    {
+        return _principal;
+    }
+
     private void throwUnsupportedForReplica()
     {
         throw new IllegalStateException("The virtual host state of " + getState()

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractBrokerLogger.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractBrokerLogger.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractBrokerLogger.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractBrokerLogger.java Mon Jun 15 15:43:53 2015
@@ -20,167 +20,24 @@
  */
 package org.apache.qpid.server.logging;
 
+import java.util.Collection;
 import java.util.Map;
 
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
-import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.BrokerLogger;
 import org.apache.qpid.server.model.BrokerLoggerFilter;
-import org.apache.qpid.server.model.ConfigurationChangeListener;
-import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.State;
-import org.apache.qpid.server.model.StateTransition;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public abstract class AbstractBrokerLogger<X extends AbstractBrokerLogger<X>> extends AbstractConfiguredObject<X> implements BrokerLogger<X>, ConfigurationChangeListener
+public abstract class AbstractBrokerLogger<X extends AbstractBrokerLogger<X>> extends AbstractLogger<X> implements BrokerLogger<X>
 {
-    protected CompositeFilter _compositeFilter = new CompositeFilter();
-
     protected AbstractBrokerLogger(Map<String, Object> attributes, Broker<?> broker)
     {
-        super(parentsMap(broker), attributes);
-    }
-
-    protected CompositeFilter getCompositeFilter()
-    {
-        return _compositeFilter;
-    }
-
-    @Override
-    protected void postResolveChildren()
-    {
-        super.postResolveChildren();
-
-        ch.qos.logback.classic.Logger rootLogger = getRootLogger();
-        final Appender<ILoggingEvent> appender = asAppender();
-        rootLogger.addAppender(appender);
-        appender.start();
-
-        StartupAppender startupAppender = (StartupAppender) rootLogger.getAppender(StartupAppender.class.getName());
-        if (startupAppender != null)
-        {
-            startupAppender.replayAccumulatedEvents(appender);
-        }
-    }
-
-    @Override
-    public void stopLogging()
-    {
-        Appender appender = getLoggerAppender();
-        appender.stop();
-        getRootLogger().detachAppender(getName());
-    }
-
-    @StateTransition(currentState = {State.ACTIVE, State.UNINITIALIZED, State.ERRORED, State.STOPPED}, desiredState = State.DELETED)
-    private ListenableFuture<Void> doDelete()
-    {
-        final SettableFuture<Void> returnVal = SettableFuture.create();
-        closeAsync().addListener(new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                setState(State.DELETED);
-                stopLogging();
-                returnVal.set(null);
-            }
-        }, getTaskExecutor().getExecutor());
-        return returnVal;
-    }
-
-    @StateTransition( currentState = { State.ERRORED, State.UNINITIALIZED, State.STOPPED }, desiredState = State.ACTIVE )
-    private ListenableFuture<Void> doActivate()
-    {
-        setState(State.ACTIVE);
-        return Futures.immediateFuture(null);
-    }
-
-    private Appender<ILoggingEvent> getLoggerAppender()
-    {
-        return getRootLogger().getAppender(getName());
-    }
-
-    private ch.qos.logback.classic.Logger getRootLogger()
-    {
-        return (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+        super(attributes, broker);
     }
 
     @Override
-    protected <C extends ConfiguredObject> ListenableFuture<C> addChildAsync(Class<C> childClass, Map<String, Object> attributes, ConfiguredObject... otherParents)
+    protected Collection<? extends LoggerFilter> getLoggerFilters()
     {
-        final ListenableFuture<C> filterFuture = getObjectFactory().createAsync(childClass, attributes, this);
-        doAfter(filterFuture, new CallableWithArgument<ListenableFuture<C>, C>()
-        {
-            @Override
-            public ListenableFuture<C> call(final C child) throws Exception
-            {
-                BrokerLoggerFilter<?> filter = (BrokerLoggerFilter) child;
-                filter.addChangeListener(AbstractBrokerLogger.this);
-                getCompositeFilter().addFilter(filter);
-                return Futures.immediateFuture(child);
-            }
-        });
-        return filterFuture;
+        return getChildren(BrokerLoggerFilter.class);
     }
 
-    @Override
-    public void stateChanged(ConfiguredObject<?> object, State oldState, State newState)
-    {
-        if (newState == State.DELETED && object instanceof BrokerLoggerFilter)
-        {
-            getCompositeFilter().removeFilter((BrokerLoggerFilter)object);
-            object.removeChangeListener(this);
-        }
-    }
-
-    @Override
-    public void childAdded(ConfiguredObject<?> object, ConfiguredObject<?> child)
-    {
-        // no-op
-    }
-
-    @Override
-    public void childRemoved(ConfiguredObject<?> object, ConfiguredObject<?> child)
-    {
-        // no-op
-    }
-
-    @Override
-    public void attributeSet(ConfiguredObject<?> object, String attributeName, Object oldAttributeValue, Object newAttributeValue)
-    {
-        // no-op
-    }
-
-    @Override
-    public void bulkChangeStart(ConfiguredObject<?> object)
-    {
-        // no-op
-    }
-
-    @Override
-    public void bulkChangeEnd(ConfiguredObject<?> object)
-    {
-        // no-op
-    }
-
-    protected void initializeAppender(Appender<ILoggingEvent> appender)
-    {
-        ch.qos.logback.classic.Logger rootLogger = getRootLogger();
-        LoggerContext loggerContext = rootLogger.getLoggerContext();
-
-        appender.setContext(loggerContext);
-
-        CompositeFilter compositeFilter = getCompositeFilter();
-        compositeFilter.addFilters(getChildren(BrokerLoggerFilter.class));
-        appender.addFilter(compositeFilter);
-        appender.setName(getName());
-    }
 }

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractLogger.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractLogger.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractLogger.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractLogger.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,171 @@
+/*
+ *
+ * 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.qpid.server.logging;
+
+import java.util.Collection;
+import java.util.Map;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.Context;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.ConfigurationChangeListener;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.StateTransition;
+
+public abstract class AbstractLogger<X extends AbstractLogger<X>> extends AbstractConfiguredObject<X>
+{
+    private final CompositeFilter _compositeFilter = new CompositeFilter();
+    private final static ch.qos.logback.classic.Logger ROOT_LOGGER = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME));
+
+    protected AbstractLogger(Map<String, Object> attributes, ConfiguredObject<?> parent)
+    {
+        super(parentsMap(parent), attributes);
+
+        addChangeListener(new FilterListener());
+    }
+
+    @Override
+    protected void postResolveChildren()
+    {
+        super.postResolveChildren();
+
+        LoggerContext loggerContext = ROOT_LOGGER.getLoggerContext();
+
+        Appender<ILoggingEvent> appender = asAppender(loggerContext);
+        appender.setName(getName());
+        appender.setContext(loggerContext);
+
+        for(LoggerFilter filter : getLoggerFilters())
+        {
+            _compositeFilter.addFilter(filter);
+        }
+        appender.addFilter(_compositeFilter);
+
+        ROOT_LOGGER.addAppender(appender);
+        appender.start();
+
+        // TODO generalise for virtualhost too
+        StartupAppender startupAppender = (StartupAppender) ROOT_LOGGER.getAppender(StartupAppender.class.getName());
+        if (startupAppender != null)
+        {
+            startupAppender.replayAccumulatedEvents(appender);
+        }
+    }
+
+    protected abstract Appender<ILoggingEvent> asAppender(Context context);
+
+    protected abstract Collection<? extends LoggerFilter> getLoggerFilters();
+
+    @StateTransition( currentState = { State.ERRORED, State.UNINITIALIZED, State.STOPPED }, desiredState = State.ACTIVE )
+    private ListenableFuture<Void> doActivate()
+    {
+        setState(State.ACTIVE);
+        return Futures.immediateFuture(null);
+    }
+
+    @StateTransition(currentState = {State.ACTIVE, State.UNINITIALIZED, State.ERRORED, State.STOPPED}, desiredState = State.DELETED)
+    private ListenableFuture<Void> doDelete()
+    {
+        final SettableFuture<Void> returnVal = SettableFuture.create();
+        closeAsync().addListener(new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                deleted();
+                setState(State.DELETED);
+                stopLogging();
+                returnVal.set(null);
+            }
+        }, getTaskExecutor().getExecutor());
+        return returnVal;
+    }
+
+    @Override
+    protected <C extends ConfiguredObject> ListenableFuture<C> addChildAsync(Class<C> childClass, Map<String, Object> attributes, ConfiguredObject... otherParents)
+    {
+        return getObjectFactory().createAsync(childClass, attributes, this);
+    }
+
+    public void stopLogging()
+    {
+        Appender appender = ROOT_LOGGER.getAppender(getName());
+        if (appender != null)
+        {
+            appender.stop();
+            ROOT_LOGGER.detachAppender(appender);
+        }
+    }
+
+    private class FilterListener implements ConfigurationChangeListener
+    {
+
+        @Override
+        public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
+        {
+            if (child instanceof LoggerFilter)
+            {
+                _compositeFilter.addFilter((LoggerFilter) child);
+            }
+        }
+
+        @Override
+        public void childRemoved(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
+        {
+            if (child instanceof LoggerFilter)
+            {
+                _compositeFilter.removeFilter((LoggerFilter) child);
+            }
+        }
+
+        @Override
+        public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
+        {
+        }
+
+        @Override
+        public void attributeSet(final ConfiguredObject<?> object,
+                                 final String attributeName,
+                                 final Object oldAttributeValue,
+                                 final Object newAttributeValue)
+        {
+        }
+
+        @Override
+        public void bulkChangeStart(final ConfiguredObject<?> object)
+        {
+        }
+
+        @Override
+        public void bulkChangeEnd(final ConfiguredObject<?> object)
+        {
+        }
+    }
+}

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractNameAndLevelFilter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractNameAndLevelFilter.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractNameAndLevelFilter.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractNameAndLevelFilter.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,90 @@
+package org.apache.qpid.server.logging;
+
+import java.util.Map;
+import java.util.Set;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.filter.Filter;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.StateTransition;
+
+public abstract class AbstractNameAndLevelFilter<X extends AbstractNameAndLevelFilter<X>> extends AbstractConfiguredObject<X>
+{
+    @ManagedAttributeField
+    private String _loggerName;
+    @ManagedAttributeField(afterSet = "logLevelAfterSet")
+    private LogLevel _level;
+
+    private LoggerNameAndLevelFilter _filter;
+
+    protected AbstractNameAndLevelFilter(final Map<Class<? extends ConfiguredObject>, ConfiguredObject<?>> parents,
+                                         Map<String, Object> attributes)
+    {
+        super(parents, attributes);
+    }
+
+    @Override
+    protected void postResolve()
+    {
+        super.postResolve();
+        _filter = new LoggerNameAndLevelFilter(getLoggerName(), Level.toLevel(getLevel().name()));
+    }
+
+
+    public String getLoggerName()
+    {
+        return _loggerName;
+    }
+
+    public LogLevel getLevel()
+    {
+        return _level;
+    }
+
+    private void logLevelAfterSet()
+    {
+        if (_filter != null)
+        {
+            _filter.setLevel(Level.toLevel(getLevel().name()));
+        }
+    }
+
+    public Filter<ILoggingEvent> asFilter()
+    {
+        return _filter;
+    }
+
+    @StateTransition( currentState = { State.ACTIVE, State.ERRORED, State.UNINITIALIZED }, desiredState = State.DELETED )
+    private ListenableFuture<Void> doDelete()
+    {
+        final SettableFuture<Void> returnVal = SettableFuture.create();
+        closeAsync().addListener(new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                deleted();
+                setState(State.DELETED);
+                returnVal.set(null);
+
+            }
+        }, getTaskExecutor().getExecutor());
+        return returnVal;
+    }
+
+    @StateTransition( currentState = { State.ERRORED, State.UNINITIALIZED }, desiredState = State.ACTIVE )
+    private ListenableFuture<Void> doActivate()
+    {
+        setState(State.ACTIVE);
+        return Futures.immediateFuture(null);
+    }
+}

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractVirtualHostLogger.java (from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractVirtualHostLogger.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractVirtualHostLogger.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java&r1=1685537&r2=1685599&rev=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/AbstractVirtualHostLogger.java Mon Jun 15 15:43:53 2015
@@ -20,26 +20,25 @@
  */
 package org.apache.qpid.server.logging;
 
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.filter.Filter;
-import ch.qos.logback.core.spi.FilterReply;
+import java.util.Collection;
+import java.util.Map;
 
-public class DenyAllFilter extends Filter<ILoggingEvent>
-{
-    private static final Filter<ILoggingEvent> INSTANCE = new DenyAllFilter();
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.model.VirtualHostLogger;
+import org.apache.qpid.server.model.VirtualHostLoggerFilter;
 
-    private DenyAllFilter()
-    {
-    }
+public abstract class AbstractVirtualHostLogger <X extends AbstractVirtualHostLogger<X>> extends AbstractLogger<X> implements VirtualHostLogger<X>
+{
 
-    public static Filter<ILoggingEvent> getInstance()
+    protected AbstractVirtualHostLogger(Map<String, Object> attributes, VirtualHost<?,?,?> virtualHost)
     {
-        return INSTANCE;
+        super(attributes, virtualHost);
     }
 
-    public FilterReply decide(final ILoggingEvent event)
+    @Override
+    protected Collection<? extends LoggerFilter> getLoggerFilters()
     {
-        return FilterReply.DENY;
+        return getChildren(VirtualHostLoggerFilter.class);
     }
 
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerConsoleLoggerImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerConsoleLoggerImpl.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerConsoleLoggerImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerConsoleLoggerImpl.java Mon Jun 15 15:43:53 2015
@@ -26,8 +26,7 @@ import ch.qos.logback.classic.encoder.Pa
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.Appender;
 import ch.qos.logback.core.ConsoleAppender;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import ch.qos.logback.core.Context;
 
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ManagedAttributeField;
@@ -51,18 +50,18 @@ public class BrokerConsoleLoggerImpl ext
     }
 
     @Override
-    public Appender<ILoggingEvent> asAppender()
+    public Appender<ILoggingEvent> asAppender(Context context)
     {
         ConsoleAppender<ILoggingEvent> consoleAppender = new ConsoleAppender<>();
-        initializeAppender(consoleAppender);
 
         final PatternLayoutEncoder encoder = new PatternLayoutEncoder();
         encoder.setPattern(getLayout());
-        encoder.setContext(consoleAppender.getContext());
+        encoder.setContext(context);
         encoder.start();
 
         consoleAppender.setEncoder(encoder);
 
         return consoleAppender;
     }
+
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java Mon Jun 15 15:43:53 2015
@@ -47,9 +47,6 @@ public interface BrokerFileLogger<X exte
     @ManagedAttribute( defaultValue = "100mb")
     String getMaxFileSize();
 
-    @ManagedAttribute( defaultValue = "false" )
-    boolean isSafeMode();
-
     @ManagedAttribute(defaultValue = "%d %-5p [%t] \\(%c{2}\\) - %m%n")
     String getLayout();
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java Mon Jun 15 15:43:53 2015
@@ -20,27 +20,17 @@
  */
 package org.apache.qpid.server.logging;
 
-import java.io.File;
 import java.util.Map;
 
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.Appender;
 import ch.qos.logback.core.Context;
-import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
-import ch.qos.logback.core.rolling.RollingFileAppender;
-import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP;
-import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
-import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ManagedAttributeField;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
 
-public class BrokerFileLoggerImpl extends AbstractBrokerLogger<BrokerFileLoggerImpl> implements BrokerFileLogger<BrokerFileLoggerImpl>
+public class BrokerFileLoggerImpl extends AbstractBrokerLogger<BrokerFileLoggerImpl> implements BrokerFileLogger<BrokerFileLoggerImpl>, FileLoggerSettings
 {
     @ManagedAttributeField
     private String _layout;
@@ -56,8 +46,6 @@ public class BrokerFileLoggerImpl extend
     private int _maxHistory;
     @ManagedAttributeField
     private String _maxFileSize;
-    @ManagedAttributeField
-    private boolean _safeMode;
 
     @ManagedObjectFactoryConstructor
     protected BrokerFileLoggerImpl(final Map<String, Object> attributes, Broker<?> broker)
@@ -102,147 +90,15 @@ public class BrokerFileLoggerImpl extend
     }
 
     @Override
-    public boolean isSafeMode()
-    {
-        return _safeMode;
-    }
-
-    @Override
     public String getLayout()
     {
         return _layout;
     }
 
     @Override
-    public Appender<ILoggingEvent> asAppender()
+    public Appender<ILoggingEvent> asAppender(Context loggerContext)
     {
-        RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>();
-        appender.setFile(getFileName());
-        appender.setAppend(true);
-
-        initializeAppender(appender);
-        Context loggerContext = appender.getContext();
-
-        if(isRollDaily())
-        {
-            DailyTriggeringPolicy triggeringPolicy = new DailyTriggeringPolicy();
-            triggeringPolicy.setContext(loggerContext);
-            TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
-            rollingPolicy.setContext(loggerContext);
-            rollingPolicy.setMaxHistory(getMaxHistory());
-            rollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggeringPolicy);
-            rollingPolicy.setFileNamePattern(getFileName() + ".%d{yyyy-MM-dd}.%i" + (isCompressOldFiles()
-                    ? ".gz"
-                    : ""));
-            appender.setRollingPolicy(rollingPolicy);
-            rollingPolicy.setParent(appender);
-            rollingPolicy.start();
-        }
-        else
-        {
-            SizeTriggeringPolicy sizeTriggeringPolicy = new SizeTriggeringPolicy();
-            sizeTriggeringPolicy.setContext(loggerContext);
-            SimpleRollingPolicy rollingPolicy = new SimpleRollingPolicy();
-            rollingPolicy.setContext(loggerContext);
-            rollingPolicy.setFileNamePattern(getFileName() + ".%i" + (isCompressOldFiles() ? ".gz" : ""));
-            appender.setRollingPolicy(rollingPolicy);
-            appender.setTriggeringPolicy(sizeTriggeringPolicy);
-            rollingPolicy.setParent(appender);
-            rollingPolicy.start();
-            sizeTriggeringPolicy.start();
-        }
-        final PatternLayoutEncoder encoder = new PatternLayoutEncoder();
-        encoder.setPattern("%d %-5p [%t] \\(%c{2}\\) - %m%n");
-        encoder.setContext(loggerContext);
-        encoder.start();
-        appender.setEncoder(encoder);
-        return appender;
-    }
-
-    private class DailyTriggeringPolicy extends SizeAndTimeBasedFNATP<ILoggingEvent>
-    {
-        private final boolean _rollOnRestart;
-        private boolean _isFirst = true;
-
-        public DailyTriggeringPolicy()
-        {
-            _rollOnRestart = isRollOnRestart();
-            setMaxFileSize(getMaxFileSize());
-
-        }
-
-        @Override
-        protected void computeNextCheck()
-        {
-            super.computeNextCheck();
-            if (_rollOnRestart && _isFirst)
-            {
-                _isFirst = false;
-                nextCheck = 0l;
-            }
-        }
-
-        @Override
-        public boolean isTriggeringEvent(final File activeFile, final ILoggingEvent event)
-        {
-            if (_rollOnRestart && _isFirst)
-            {
-                _isFirst = false;
-                return activeFile.exists() && activeFile.length() != 0l;
-            }
-            else
-            {
-                return super.isTriggeringEvent(activeFile, event);
-            }
-        }
-
-    }
-
-
-    private class SizeTriggeringPolicy extends SizeBasedTriggeringPolicy<ILoggingEvent>
-    {
-        private final boolean _rollOnRestart;
-        private boolean _isFirst = true;
-
-        public SizeTriggeringPolicy()
-        {
-            _rollOnRestart = isRollOnRestart();
-            setMaxFileSize(getMaxFileSize());
-
-        }
-
-        @Override
-        public boolean isTriggeringEvent(final File activeFile, final ILoggingEvent event)
-        {
-            if (_rollOnRestart && _isFirst)
-            {
-                _isFirst = false;
-                return activeFile.exists() && activeFile.length() != 0l;
-            }
-            else
-            {
-                return super.isTriggeringEvent(activeFile, event);
-            }
-        }
-
-    }
-
-    private class SimpleRollingPolicy extends FixedWindowRollingPolicy
-    {
-        private int _maxFiles;
-
-        public SimpleRollingPolicy()
-        {
-            _maxFiles = getMaxHistory();
-            setMaxIndex(getMaxHistory());
-            setMinIndex(1);
-        }
-
-        @Override
-        protected int getMaxWindowSize()
-        {
-            return _maxFiles;
-        }
+        return new RollingFileAppenderFactory().createRollingFileAppender(this, loggerContext);
     }
 
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerMemoryLoggerImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerMemoryLoggerImpl.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerMemoryLoggerImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerMemoryLoggerImpl.java Mon Jun 15 15:43:53 2015
@@ -22,11 +22,9 @@ package org.apache.qpid.server.logging;
 
 import java.util.Map;
 
-import ch.qos.logback.classic.LoggerContext;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.Appender;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import ch.qos.logback.core.Context;
 
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ManagedAttributeField;
@@ -51,10 +49,9 @@ public class BrokerMemoryLoggerImpl exte
     }
 
     @Override
-    public Appender<ILoggingEvent> asAppender()
+    public Appender<ILoggingEvent> asAppender(Context context)
     {
-        final RecordEventAppender appender = new RecordEventAppender(getMaxRecords());
-        initializeAppender(appender);
-        return appender;
+        return new RecordEventAppender(getMaxRecords());
     }
+
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterImpl.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterImpl.java Mon Jun 15 15:43:53 2015
@@ -23,33 +23,14 @@ package org.apache.qpid.server.logging;
 import java.util.Map;
 import java.util.Set;
 
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.filter.Filter;
-import ch.qos.logback.core.spi.FilterReply;
-
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
-import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.BrokerLogger;
 import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.ManagedAttributeField;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
-import org.apache.qpid.server.model.State;
-import org.apache.qpid.server.model.StateTransition;
 
-public class BrokerNameAndLevelFilterImpl extends AbstractConfiguredObject<BrokerNameAndLevelFilterImpl>
+public class BrokerNameAndLevelFilterImpl extends AbstractNameAndLevelFilter<BrokerNameAndLevelFilterImpl>
         implements BrokerNameAndLevelFilter<BrokerNameAndLevelFilterImpl>
 {
-    @ManagedAttributeField
-    private String _loggerName;
-    @ManagedAttributeField(afterSet = "logLevelAfterSet")
-    private LogLevel _level;
-
-    private volatile Level _logbackLevel;
 
     @ManagedObjectFactoryConstructor
     protected BrokerNameAndLevelFilterImpl(final Map<String, Object> attributes, BrokerLogger<?> logger)
@@ -63,91 +44,12 @@ public class BrokerNameAndLevelFilterImp
         super.validateChange(proxyForValidation, changedAttributes);
         BrokerNameAndLevelFilter proxyFilter = (BrokerNameAndLevelFilter)proxyForValidation;
         if (changedAttributes.contains(LOGGER_NAME) &&
-                ((getLoggerName() != null && !getLoggerName().equals(proxyFilter.getLoggerName())) ||
-                        (getLoggerName() == null && proxyFilter.getLoggerName() != null)))
+            ((getLoggerName() != null && !getLoggerName().equals(proxyFilter.getLoggerName())) ||
+             (getLoggerName() == null && proxyFilter.getLoggerName() != null)))
         {
             throw new IllegalConfigurationException("Attribute '" + LOGGER_NAME + " cannot be changed");
         }
     }
 
-    @Override
-    public String getLoggerName()
-    {
-        return _loggerName;
-    }
-
-    @Override
-    public LogLevel getLevel()
-    {
-        return _level;
-    }
-
-    private void logLevelAfterSet()
-    {
-        _logbackLevel = Level.toLevel(getLevel().name());
-    }
 
-    @Override
-    public Filter<ILoggingEvent> asFilter()
-    {
-        final String loggerName = getLoggerName();
-        if("".equals(loggerName) || Logger.ROOT_LOGGER_NAME.equals(loggerName))
-        {
-            return new Filter<ILoggingEvent>()
-            {
-                @Override
-                public FilterReply decide(final ILoggingEvent event)
-                {
-                    return event.getLevel().isGreaterOrEqual(_logbackLevel) ? FilterReply.ACCEPT : FilterReply.NEUTRAL;
-                }
-            };
-        }
-        else if(loggerName.endsWith(".*"))
-        {
-            final String prefixName = loggerName.substring(0,loggerName.length()-2);
-            return new Filter<ILoggingEvent>()
-            {
-                @Override
-                public FilterReply decide(final ILoggingEvent event)
-                {
-                    return event.getLevel().isGreaterOrEqual(_logbackLevel) && event.getLoggerName().startsWith(prefixName) ? FilterReply.ACCEPT : FilterReply.NEUTRAL;
-                }
-            };
-        }
-        else
-        {
-            return new Filter<ILoggingEvent>()
-            {
-                @Override
-                public FilterReply decide(final ILoggingEvent event)
-                {
-                    return event.getLevel().isGreaterOrEqual(_logbackLevel) && event.getLoggerName().equals(loggerName) ? FilterReply.ACCEPT : FilterReply.NEUTRAL;
-                }
-            };
-        }
-    }
-
-    @StateTransition( currentState = { State.ACTIVE, State.ERRORED, State.UNINITIALIZED }, desiredState = State.DELETED )
-    private ListenableFuture<Void> doDelete()
-    {
-        final SettableFuture<Void> returnVal = SettableFuture.create();
-        closeAsync().addListener(new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                setState(State.DELETED);
-                returnVal.set(null);
-
-            }
-        }, getTaskExecutor().getExecutor());
-        return returnVal;
-    }
-
-    @StateTransition( currentState = { State.ERRORED, State.UNINITIALIZED }, desiredState = State.ACTIVE )
-    private ListenableFuture<Void> doActivate()
-    {
-        setState(State.ACTIVE);
-        return Futures.immediateFuture(null);
-    }
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/CompositeFilter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/CompositeFilter.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/CompositeFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/CompositeFilter.java Mon Jun 15 15:43:53 2015
@@ -34,22 +34,22 @@ public class CompositeFilter extends Fil
 {
     private List<Filter<ILoggingEvent>> _filterList = new CopyOnWriteArrayList<>();
 
-    public void addFilter(BrokerLoggerFilter filter)
+    public void addFilter(LoggerFilter filter)
     {
         Filter f = filter.asFilter();
         f.setName(filter.getName());
         _filterList.add(f);
     }
 
-    public void addFilters(Collection<BrokerLoggerFilter> filters)
+    public void addFilters(Collection<LoggerFilter> filters)
     {
-        for(BrokerLoggerFilter<?> filter : filters)
+        for(LoggerFilter filter : filters)
         {
             addFilter(filter);
         }
     }
 
-    public void removeFilter(BrokerLoggerFilter filter)
+    public void removeFilter(LoggerFilter filter)
     {
         Iterator<Filter<ILoggingEvent>> it = _filterList.iterator();
         while(it.hasNext())

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/FileLoggerSettings.java (from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLoggerFilter.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/FileLoggerSettings.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/FileLoggerSettings.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLoggerFilter.java&r1=1685537&r2=1685599&rev=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLoggerFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/FileLoggerSettings.java Mon Jun 15 15:43:53 2015
@@ -18,13 +18,21 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.model;
+package org.apache.qpid.server.logging;
 
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.filter.Filter;
-
-@ManagedObject
-public interface BrokerLoggerFilter<X extends BrokerLoggerFilter<X>> extends ConfiguredObject<X>
+public interface FileLoggerSettings
 {
-    Filter<ILoggingEvent> asFilter();
+    String getFileName();
+
+    boolean isRollDaily();
+
+    boolean isRollOnRestart();
+
+    boolean isCompressOldFiles();
+
+    int getMaxHistory();
+
+    String getMaxFileSize();
+
+    String getLayout();
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogRecorder.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogRecorder.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogRecorder.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogRecorder.java Mon Jun 15 15:43:53 2015
@@ -29,11 +29,9 @@ public class LogRecorder implements Iter
 
     private final RecordEventAppender _eventAppender;
 
-    public void closeLogRecorder()
+    public LogRecorder(RecordEventAppender eventAppender)
     {
-        Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
-        rootLogger.detachAppender(_eventAppender);
-        _eventAppender.stop();
+        _eventAppender = eventAppender;
     }
 
     @Override
@@ -43,9 +41,4 @@ public class LogRecorder implements Iter
         return buffer != null ?  buffer.asList().iterator() : Collections.<LogRecord>emptyIterator();
     }
 
-    public LogRecorder(RecordEventAppender eventAppender)
-    {
-        _eventAppender = eventAppender;
-    }
-
 }

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerFilter.java (from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerFilter.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerFilter.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java&r1=1685537&r2=1685599&rev=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerFilter.java Mon Jun 15 15:43:53 2015
@@ -22,24 +22,10 @@ package org.apache.qpid.server.logging;
 
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.filter.Filter;
-import ch.qos.logback.core.spi.FilterReply;
 
-public class DenyAllFilter extends Filter<ILoggingEvent>
+public interface LoggerFilter
 {
-    private static final Filter<ILoggingEvent> INSTANCE = new DenyAllFilter();
-
-    private DenyAllFilter()
-    {
-    }
-
-    public static Filter<ILoggingEvent> getInstance()
-    {
-        return INSTANCE;
-    }
-
-    public FilterReply decide(final ILoggingEvent event)
-    {
-        return FilterReply.DENY;
-    }
+    Filter<ILoggingEvent> asFilter();
 
+    String getName();
 }

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,100 @@
+/*
+ *
+ * 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.qpid.server.logging;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.filter.Filter;
+import ch.qos.logback.core.spi.FilterReply;
+
+public class LoggerNameAndLevelFilter extends Filter<ILoggingEvent>
+{
+    private final Filter<ILoggingEvent> _filter;
+    private final String _loggerName;
+    private volatile Level _level;
+
+    public LoggerNameAndLevelFilter(String loggerName, Level level)
+    {
+        _level = level;
+        _loggerName = loggerName;
+        _filter = createFilter(loggerName);
+    }
+
+    @Override
+    public FilterReply decide(ILoggingEvent event)
+    {
+        return _filter.decide(event);
+    }
+
+    public void setLevel(Level level)
+    {
+        _level = level;
+    }
+
+    public Level getLevel()
+    {
+        return _level;
+    }
+
+    public String getLoggerName()
+    {
+        return _loggerName;
+    }
+
+    private Filter<ILoggingEvent> createFilter(final String loggerName)
+    {
+        if(loggerName == null || "".equals(loggerName) || Logger.ROOT_LOGGER_NAME.equals(loggerName))
+        {
+            return new Filter<ILoggingEvent>()
+            {
+                @Override
+                public FilterReply decide(final ILoggingEvent event)
+                {
+                    return event.getLevel().isGreaterOrEqual(_level) ? FilterReply.ACCEPT : FilterReply.NEUTRAL;
+                }
+            };
+        }
+        else if(loggerName.endsWith(".*"))
+        {
+            final String prefixName = loggerName.substring(0,loggerName.length()-2);
+            return new Filter<ILoggingEvent>()
+            {
+                @Override
+                public FilterReply decide(final ILoggingEvent event)
+                {
+                    return event.getLevel().isGreaterOrEqual(_level) && event.getLoggerName().startsWith(prefixName) ? FilterReply.ACCEPT : FilterReply.NEUTRAL;
+                }
+            };
+        }
+        else
+        {
+            return new Filter<ILoggingEvent>()
+            {
+                @Override
+                public FilterReply decide(final ILoggingEvent event)
+                {
+                    return event.getLevel().isGreaterOrEqual(_level) && event.getLoggerName().equals(loggerName) ? FilterReply.ACCEPT : FilterReply.NEUTRAL;
+                }
+            };
+        }
+    }
+}

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PrincipalLogEventFilter.java (from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PrincipalLogEventFilter.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PrincipalLogEventFilter.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java&r1=1685537&r2=1685599&rev=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PrincipalLogEventFilter.java Mon Jun 15 15:43:53 2015
@@ -20,26 +20,33 @@
  */
 package org.apache.qpid.server.logging;
 
+import java.security.AccessController;
+import java.security.Principal;
+
+import javax.security.auth.Subject;
+
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.filter.Filter;
 import ch.qos.logback.core.spi.FilterReply;
 
-public class DenyAllFilter extends Filter<ILoggingEvent>
-{
-    private static final Filter<ILoggingEvent> INSTANCE = new DenyAllFilter();
 
-    private DenyAllFilter()
-    {
-    }
+public class PrincipalLogEventFilter extends Filter<ILoggingEvent>
+{
+    private final Principal _principal;
 
-    public static Filter<ILoggingEvent> getInstance()
+    public PrincipalLogEventFilter(final Principal principal)
     {
-        return INSTANCE;
+        _principal = principal;
     }
 
-    public FilterReply decide(final ILoggingEvent event)
+    @Override
+    public FilterReply decide(ILoggingEvent event)
     {
+        Subject subject = Subject.getSubject(AccessController.getContext());
+        if (subject != null && subject.getPrincipals().contains(_principal))
+        {
+            return FilterReply.NEUTRAL;
+        }
         return FilterReply.DENY;
     }
-
 }

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java (from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java&r1=1685537&r2=1685599&rev=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java Mon Jun 15 15:43:53 2015
@@ -21,117 +21,34 @@
 package org.apache.qpid.server.logging;
 
 import java.io.File;
-import java.util.Map;
 
-import ch.qos.logback.classic.LoggerContext;
 import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
 import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
 import ch.qos.logback.core.Context;
 import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
 import ch.qos.logback.core.rolling.RollingFileAppender;
 import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP;
 import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
 import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.server.model.Broker;
-import org.apache.qpid.server.model.ManagedAttributeField;
-import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
-
-public class BrokerFileLoggerImpl extends AbstractBrokerLogger<BrokerFileLoggerImpl> implements BrokerFileLogger<BrokerFileLoggerImpl>
+public class RollingFileAppenderFactory
 {
-    @ManagedAttributeField
-    private String _layout;
-    @ManagedAttributeField
-    private String _fileName;
-    @ManagedAttributeField
-    private boolean _rollDaily;
-    @ManagedAttributeField
-    private boolean _rollOnRestart;
-    @ManagedAttributeField
-    private boolean _compressOldFiles;
-    @ManagedAttributeField
-    private int _maxHistory;
-    @ManagedAttributeField
-    private String _maxFileSize;
-    @ManagedAttributeField
-    private boolean _safeMode;
-
-    @ManagedObjectFactoryConstructor
-    protected BrokerFileLoggerImpl(final Map<String, Object> attributes, Broker<?> broker)
-    {
-        super(attributes, broker);
-    }
-
-    @Override
-    public String getFileName()
-    {
-        return _fileName;
-    }
-
-    @Override
-    public boolean isRollDaily()
-    {
-        return _rollDaily;
-    }
-
-    @Override
-    public boolean isRollOnRestart()
-    {
-        return _rollOnRestart;
-    }
-
-    @Override
-    public boolean isCompressOldFiles()
-    {
-        return _compressOldFiles;
-    }
-
-    @Override
-    public int getMaxHistory()
-    {
-        return _maxHistory;
-    }
-
-    @Override
-    public String getMaxFileSize()
-    {
-        return _maxFileSize;
-    }
-
-    @Override
-    public boolean isSafeMode()
-    {
-        return _safeMode;
-    }
-
-    @Override
-    public String getLayout()
-    {
-        return _layout;
-    }
-
-    @Override
-    public Appender<ILoggingEvent> asAppender()
+    public RollingFileAppender<ILoggingEvent> createRollingFileAppender(FileLoggerSettings fileLoggerSettings, Context loggerContext)
     {
         RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>();
-        appender.setFile(getFileName());
+        appender.setFile(fileLoggerSettings.getFileName());
         appender.setAppend(true);
+        appender.setContext(loggerContext);
 
-        initializeAppender(appender);
-        Context loggerContext = appender.getContext();
-
-        if(isRollDaily())
+        if(fileLoggerSettings.isRollDaily())
         {
-            DailyTriggeringPolicy triggeringPolicy = new DailyTriggeringPolicy();
+            DailyTriggeringPolicy triggeringPolicy = new DailyTriggeringPolicy(fileLoggerSettings.isRollOnRestart(), fileLoggerSettings.getMaxFileSize());
             triggeringPolicy.setContext(loggerContext);
             TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
             rollingPolicy.setContext(loggerContext);
-            rollingPolicy.setMaxHistory(getMaxHistory());
+            rollingPolicy.setMaxHistory(fileLoggerSettings.getMaxHistory());
             rollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggeringPolicy);
-            rollingPolicy.setFileNamePattern(getFileName() + ".%d{yyyy-MM-dd}.%i" + (isCompressOldFiles()
+            rollingPolicy.setFileNamePattern(fileLoggerSettings.getFileName() + ".%d{yyyy-MM-dd}.%i" + (fileLoggerSettings.isCompressOldFiles()
                     ? ".gz"
                     : ""));
             appender.setRollingPolicy(rollingPolicy);
@@ -140,11 +57,11 @@ public class BrokerFileLoggerImpl extend
         }
         else
         {
-            SizeTriggeringPolicy sizeTriggeringPolicy = new SizeTriggeringPolicy();
+            SizeTriggeringPolicy sizeTriggeringPolicy = new SizeTriggeringPolicy(fileLoggerSettings.isRollOnRestart(), fileLoggerSettings.getMaxFileSize());
             sizeTriggeringPolicy.setContext(loggerContext);
-            SimpleRollingPolicy rollingPolicy = new SimpleRollingPolicy();
+            SimpleRollingPolicy rollingPolicy = new SimpleRollingPolicy(fileLoggerSettings.getMaxHistory());
             rollingPolicy.setContext(loggerContext);
-            rollingPolicy.setFileNamePattern(getFileName() + ".%i" + (isCompressOldFiles() ? ".gz" : ""));
+            rollingPolicy.setFileNamePattern(fileLoggerSettings.getFileName() + ".%i" + (fileLoggerSettings.isCompressOldFiles() ? ".gz" : ""));
             appender.setRollingPolicy(rollingPolicy);
             appender.setTriggeringPolicy(sizeTriggeringPolicy);
             rollingPolicy.setParent(appender);
@@ -159,16 +76,16 @@ public class BrokerFileLoggerImpl extend
         return appender;
     }
 
-    private class DailyTriggeringPolicy extends SizeAndTimeBasedFNATP<ILoggingEvent>
+
+    class DailyTriggeringPolicy extends SizeAndTimeBasedFNATP<ILoggingEvent>
     {
         private final boolean _rollOnRestart;
         private boolean _isFirst = true;
 
-        public DailyTriggeringPolicy()
+        public DailyTriggeringPolicy(boolean isRollOnRestart, String maxFileSize)
         {
-            _rollOnRestart = isRollOnRestart();
-            setMaxFileSize(getMaxFileSize());
-
+            _rollOnRestart = isRollOnRestart;
+            setMaxFileSize(maxFileSize);
         }
 
         @Override
@@ -198,16 +115,15 @@ public class BrokerFileLoggerImpl extend
 
     }
 
-
-    private class SizeTriggeringPolicy extends SizeBasedTriggeringPolicy<ILoggingEvent>
+    class SizeTriggeringPolicy extends SizeBasedTriggeringPolicy<ILoggingEvent>
     {
         private final boolean _rollOnRestart;
         private boolean _isFirst = true;
 
-        public SizeTriggeringPolicy()
+        public SizeTriggeringPolicy(boolean isRollOnRestart, String maxFileSize)
         {
-            _rollOnRestart = isRollOnRestart();
-            setMaxFileSize(getMaxFileSize());
+            _rollOnRestart = isRollOnRestart;
+            setMaxFileSize(maxFileSize);
 
         }
 
@@ -227,14 +143,14 @@ public class BrokerFileLoggerImpl extend
 
     }
 
-    private class SimpleRollingPolicy extends FixedWindowRollingPolicy
+    class SimpleRollingPolicy extends FixedWindowRollingPolicy
     {
         private int _maxFiles;
 
-        public SimpleRollingPolicy()
+        public SimpleRollingPolicy(int maxHistory)
         {
-            _maxFiles = getMaxHistory();
-            setMaxIndex(getMaxHistory());
+            _maxFiles = maxHistory;
+            setMaxIndex(maxHistory);
             setMinIndex(1);
         }
 

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java (from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java&r1=1685537&r2=1685599&rev=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java Mon Jun 15 15:43:53 2015
@@ -20,16 +20,19 @@
  */
 package org.apache.qpid.server.logging;
 
-import org.apache.qpid.server.model.BrokerLogger;
+
 import org.apache.qpid.server.model.ManagedAttribute;
 import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.VirtualHostLogger;
 
-@ManagedObject( category = false, type = BrokerFileLogger.TYPE)
-public interface BrokerFileLogger<X extends BrokerFileLogger<X>> extends BrokerLogger<X>
+@ManagedObject( category = false, type = VirtualHostFileLogger.TYPE)
+public interface VirtualHostFileLogger<X extends VirtualHostFileLogger<X>> extends VirtualHostLogger<X>
 {
     String TYPE = "File";
+    String FILE_NAME = "fileName";
 
-    @ManagedAttribute( defaultValue = "${qpid.work_dir}${file.separator}log${file.separator}qpid.log")
+    //TODO: change to better default
+    @ManagedAttribute( defaultValue = "${qpid.work_dir}${file.separator}log${file.separator}${this:name}${file.separator}qpid.log")
     String getFileName();
 
     @ManagedAttribute( defaultValue = "false")
@@ -47,9 +50,6 @@ public interface BrokerFileLogger<X exte
     @ManagedAttribute( defaultValue = "100mb")
     String getMaxFileSize();
 
-    @ManagedAttribute( defaultValue = "false" )
-    boolean isSafeMode();
-
     @ManagedAttribute(defaultValue = "%d %-5p [%t] \\(%c{2}\\) - %m%n")
     String getLayout();
 }

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,117 @@
+/*
+ *
+ * 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.qpid.server.logging;
+
+import java.security.Principal;
+import java.util.Map;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.Context;
+import ch.qos.logback.core.filter.Filter;
+import ch.qos.logback.core.rolling.RollingFileAppender;
+
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
+import org.apache.qpid.server.model.VirtualHost;
+
+public class VirtualHostFileLoggerImpl extends AbstractVirtualHostLogger<VirtualHostFileLoggerImpl> implements VirtualHostFileLogger<VirtualHostFileLoggerImpl>, FileLoggerSettings
+{
+    private final Principal _principal;
+
+    @ManagedAttributeField
+    private String _layout;
+    @ManagedAttributeField
+    private String _fileName;
+    @ManagedAttributeField
+    private boolean _rollDaily;
+    @ManagedAttributeField
+    private boolean _rollOnRestart;
+    @ManagedAttributeField
+    private boolean _compressOldFiles;
+    @ManagedAttributeField
+    private int _maxHistory;
+    @ManagedAttributeField
+    private String _maxFileSize;
+    @ManagedAttributeField
+    private boolean _safeMode;
+
+    @ManagedObjectFactoryConstructor
+    protected VirtualHostFileLoggerImpl(final Map<String, Object> attributes, VirtualHost<?,?,?> virtualHost)
+    {
+        super(attributes, virtualHost);
+        _principal = virtualHost.getPrincipal();
+    }
+
+    @Override
+    public String getFileName()
+    {
+        return _fileName;
+    }
+
+    @Override
+    public boolean isRollDaily()
+    {
+        return _rollDaily;
+    }
+
+    @Override
+    public boolean isRollOnRestart()
+    {
+        return _rollOnRestart;
+    }
+
+    @Override
+    public boolean isCompressOldFiles()
+    {
+        return _compressOldFiles;
+    }
+
+    @Override
+    public int getMaxHistory()
+    {
+        return _maxHistory;
+    }
+
+    @Override
+    public String getMaxFileSize()
+    {
+        return _maxFileSize;
+    }
+
+    @Override
+    public String getLayout()
+    {
+        return _layout;
+    }
+
+    @Override
+    public Appender<ILoggingEvent> asAppender(Context loggerContext)
+    {
+        RollingFileAppender<ILoggingEvent> rollingFileAppender =
+                new RollingFileAppenderFactory().createRollingFileAppender(this, loggerContext);
+
+        Filter<ILoggingEvent> principalFilter = new PrincipalLogEventFilter(_principal);
+        rollingFileAppender.addFilter(principalFilter);
+        return rollingFileAppender;
+    }
+
+}

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilter.java (from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilter.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilter.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java&r1=1685537&r2=1685599&rev=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/DenyAllFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilter.java Mon Jun 15 15:43:53 2015
@@ -20,26 +20,20 @@
  */
 package org.apache.qpid.server.logging;
 
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.filter.Filter;
-import ch.qos.logback.core.spi.FilterReply;
+import org.apache.qpid.server.model.ManagedAttribute;
+import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.VirtualHostLoggerFilter;
 
-public class DenyAllFilter extends Filter<ILoggingEvent>
+@ManagedObject( category = false, type = VirtualHostNameAndLevelFilter.TYPE)
+public interface VirtualHostNameAndLevelFilter<X extends VirtualHostNameAndLevelFilter<X>> extends VirtualHostLoggerFilter<X>
 {
-    private static final Filter<ILoggingEvent> INSTANCE = new DenyAllFilter();
+    String TYPE = "NameAndLevel";
+    String LOGGER_NAME = "loggerName";
+    String LEVEL = "level";
 
-    private DenyAllFilter()
-    {
-    }
-
-    public static Filter<ILoggingEvent> getInstance()
-    {
-        return INSTANCE;
-    }
-
-    public FilterReply decide(final ILoggingEvent event)
-    {
-        return FilterReply.DENY;
-    }
+    @ManagedAttribute( defaultValue = "" )
+    String getLoggerName();
 
+    @ManagedAttribute(defaultValue = "INFO" )
+    LogLevel getLevel();
 }

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImpl.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImpl.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImpl.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,55 @@
+/*
+ *
+ * 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.qpid.server.logging;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
+import org.apache.qpid.server.model.VirtualHostLogger;
+
+public class VirtualHostNameAndLevelFilterImpl  extends AbstractNameAndLevelFilter<VirtualHostNameAndLevelFilterImpl>
+        implements VirtualHostNameAndLevelFilter<VirtualHostNameAndLevelFilterImpl>
+{
+
+    @ManagedObjectFactoryConstructor
+    protected VirtualHostNameAndLevelFilterImpl(final Map<String, Object> attributes, VirtualHostLogger<?> logger)
+    {
+        super(parentsMap(logger), attributes);
+    }
+
+    @Override
+    protected void validateChange(ConfiguredObject<?> proxyForValidation, Set<String> changedAttributes)
+    {
+        super.validateChange(proxyForValidation, changedAttributes);
+        VirtualHostNameAndLevelFilter proxyFilter = (VirtualHostNameAndLevelFilter)proxyForValidation;
+        if (changedAttributes.contains(LOGGER_NAME) &&
+            ((getLoggerName() != null && !getLoggerName().equals(proxyFilter.getLoggerName())) ||
+             (getLoggerName() == null && proxyFilter.getLoggerName() != null)))
+        {
+            throw new IllegalConfigurationException("Attribute '" + LOGGER_NAME + " cannot be changed");
+        }
+    }
+
+}
+

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java Mon Jun 15 15:43:53 2015
@@ -20,14 +20,8 @@
  */
 package org.apache.qpid.server.model;
 
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
-
 @ManagedObject
 public interface BrokerLogger<X extends BrokerLogger<X>> extends ConfiguredObject<X>
 {
-
-    Appender<ILoggingEvent> asAppender();
-
     void stopLogging();
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLoggerFilter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLoggerFilter.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLoggerFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLoggerFilter.java Mon Jun 15 15:43:53 2015
@@ -20,11 +20,9 @@
  */
 package org.apache.qpid.server.model;
 
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.filter.Filter;
+import org.apache.qpid.server.logging.LoggerFilter;
 
 @ManagedObject
-public interface BrokerLoggerFilter<X extends BrokerLoggerFilter<X>> extends ConfiguredObject<X>
+public interface BrokerLoggerFilter<X extends BrokerLoggerFilter<X>> extends ConfiguredObject<X>, LoggerFilter
 {
-    Filter<ILoggingEvent> asFilter();
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java Mon Jun 15 15:43:53 2015
@@ -72,6 +72,7 @@ public final class BrokerModel extends M
 
         addRelationship(SystemConfig.class, Broker.class);
 
+        addRelationship(Broker.class, BrokerLogger.class);
         addRelationship(Broker.class, VirtualHostNode.class);
         addRelationship(Broker.class, Port.class);
         addRelationship(Broker.class, AccessControlProvider.class);
@@ -80,17 +81,19 @@ public final class BrokerModel extends M
         addRelationship(Broker.class, TrustStore.class);
         addRelationship(Broker.class, KeyStore.class);
         addRelationship(Broker.class, Plugin.class);
-        addRelationship(Broker.class, BrokerLogger.class);
 
         addRelationship(BrokerLogger.class, BrokerLoggerFilter.class);
 
         addRelationship(VirtualHostNode.class, VirtualHost.class);
         addRelationship(VirtualHostNode.class, RemoteReplicationNode.class);
 
+        addRelationship(VirtualHost.class, VirtualHostLogger.class);
         addRelationship(VirtualHost.class, Connection.class);
         addRelationship(VirtualHost.class, Exchange.class);
         addRelationship(VirtualHost.class, Queue.class);
 
+        addRelationship(VirtualHostLogger.class, VirtualHostLoggerFilter.class);
+
         addRelationship(Port.class, VirtualHostAlias.class);
 
         addRelationship(AuthenticationProvider.class, User.class);

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Model.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Model.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Model.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Model.java Mon Jun 15 15:43:53 2015
@@ -75,7 +75,13 @@ public abstract class Model
         return descendants;
     }
 
-    <C extends ConfiguredObject> C getAncestor(final Class<C> ancestorClass,
+    public <C extends ConfiguredObject> C getAncestor(final Class<C> ancestorClass,
+                                                             final ConfiguredObject<?> object)
+    {
+        return getAncestor(ancestorClass, object.getCategoryClass(), object);
+    }
+
+    public  <C extends ConfiguredObject> C getAncestor(final Class<C> ancestorClass,
                                                final Class<? extends ConfiguredObject> category,
                                                final ConfiguredObject<?> object)
     {
@@ -85,7 +91,7 @@ public abstract class Model
         }
         else
         {
-            for(Class<? extends ConfiguredObject> parentClass : object.getModel().getParentTypes(category))
+            for(Class<? extends ConfiguredObject> parentClass : getParentTypes(category))
             {
                 ConfiguredObject<?> parent = object.getParent(parentClass);
                 ConfiguredObject<?> ancestor = getAncestor(ancestorClass, parentClass, parent);

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java Mon Jun 15 15:43:53 2015
@@ -21,6 +21,7 @@
 package org.apache.qpid.server.model;
 
 import java.security.AccessControlException;
+import java.security.Principal;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -30,6 +31,7 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.model.port.AmqpPort;
 import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.virtualhost.VirtualHostPrincipal;
 
 @ManagedObject( defaultType = "ProvidedStore", description = VirtualHost.CLASS_DESCRIPTION)
 public interface VirtualHost<X extends VirtualHost<X, Q, E>, Q extends Queue<?>, E extends Exchange<?> > extends ConfiguredObject<X>
@@ -159,6 +161,8 @@ public interface VirtualHost<X extends V
 
     String getRedirectHost(AmqpPort<?> port);
 
+    Principal getPrincipal();
+
     public static interface Transaction
     {
         void dequeue(MessageInstance entry);

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java (from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java&r1=1685537&r2=1685599&rev=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLogger.java Mon Jun 15 15:43:53 2015
@@ -20,14 +20,8 @@
  */
 package org.apache.qpid.server.model;
 
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
-
 @ManagedObject
-public interface BrokerLogger<X extends BrokerLogger<X>> extends ConfiguredObject<X>
+public interface VirtualHostLogger <X extends VirtualHostLogger<X>> extends ConfiguredObject<X>
 {
-
-    Appender<ILoggingEvent> asAppender();
-
     void stopLogging();
 }

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLoggerFilter.java (from r1685537, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLoggerFilter.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLoggerFilter.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java&r1=1685537&r2=1685599&rev=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerLogger.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostLoggerFilter.java Mon Jun 15 15:43:53 2015
@@ -20,14 +20,10 @@
  */
 package org.apache.qpid.server.model;
 
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
+import org.apache.qpid.server.logging.LoggerFilter;
+import org.apache.qpid.server.logging.VirtualHostNameAndLevelFilter;
 
-@ManagedObject
-public interface BrokerLogger<X extends BrokerLogger<X>> extends ConfiguredObject<X>
+@ManagedObject(defaultType = VirtualHostNameAndLevelFilter.TYPE)
+public interface VirtualHostLoggerFilter<X extends VirtualHostLoggerFilter<X>> extends ConfiguredObject<X>, LoggerFilter
 {
-
-    Appender<ILoggingEvent> asAppender();
-
-    void stopLogging();
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java Mon Jun 15 15:43:53 2015
@@ -168,15 +168,17 @@ public class BrokerAdapter extends Abstr
         ch.qos.logback.classic.Logger rootLogger =
                 (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
 
-
-        Collection<BrokerLogger> loggers = getChildren(BrokerLogger.class);
-        for(BrokerLogger<?> logger : loggers)
+        if(_logRecorder == null)
         {
-            if(_logRecorder == null && logger instanceof BrokerMemoryLogger)
+            Collection<BrokerLogger> loggers = getChildren(BrokerLogger.class);
+            for (BrokerLogger<?> logger : loggers)
             {
-                Appender appender = rootLogger.getAppender(logger.getName());
-                _logRecorder = new LogRecorder((RecordEventAppender) appender);
-                break;
+                if (logger instanceof BrokerMemoryLogger)
+                {
+                    Appender appender = rootLogger.getAppender(logger.getName());
+                    _logRecorder = new LogRecorder((RecordEventAppender) appender);
+                    break;
+                }
             }
         }
 
@@ -594,7 +596,7 @@ public class BrokerAdapter extends Abstr
     @Override
     protected ListenableFuture<Void> beforeClose()
     {
-        _brokerLoggersToClose = getChildren(BrokerLogger.class);
+        _brokerLoggersToClose = new ArrayList(getChildren(BrokerLogger.class));
         return super.beforeClose();
     }
 
@@ -608,11 +610,6 @@ public class BrokerAdapter extends Abstr
 
         _eventLogger.message(BrokerMessages.STOPPED());
 
-        if(_logRecorder != null)
-        {
-            _logRecorder.closeLogRecorder();
-        }
-
         for (BrokerLogger<?> logger: _brokerLoggersToClose)
         {
             logger.stopLogging();



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org