You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/01/10 18:06:18 UTC

[2/2] syncope git commit: [SYNCOPE-882] Several fixes

[SYNCOPE-882] Several fixes


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/cbe4b703
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/cbe4b703
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/cbe4b703

Branch: refs/heads/master
Commit: cbe4b703d251f639f9d2790732d781c39510cc52
Parents: 2b71dab
Author: Francesco Chicchiricc� <il...@apache.org>
Authored: Tue Jan 10 18:05:12 2017 +0100
Committer: Francesco Chicchiricc� <il...@apache.org>
Committed: Tue Jan 10 19:06:01 2017 +0100

----------------------------------------------------------------------
 .../commands/logger/LoggerResultManager.java    |   3 +-
 .../logger/LoggerSyncopeOperations.java         |   3 +-
 .../syncope/client/console/pages/LogViewer.java | 168 ++++---------------
 .../client/console/panels/ConsoleLogPanel.java  |  19 ++-
 .../client/console/panels/CoreLogPanel.java     |  10 +-
 .../client/console/rest/LoggerRestClient.java   |  34 ++--
 .../common/rest/api/service/LoggerService.java  |   3 +-
 .../apache/syncope/core/logic/LoggerLogic.java  |   9 +-
 .../syncope/core/logic/init/LoggerAccessor.java |  15 +-
 .../rest/cxf/service/LoggerServiceImpl.java     |   3 +-
 .../src/main/resources/log4j2.xml               |   4 +
 .../apache/syncope/fit/core/LoggerITCase.java   |   5 +-
 12 files changed, 96 insertions(+), 180 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerResultManager.java
index 62f9316..c99aedf 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerResultManager.java
@@ -24,7 +24,6 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Queue;
 import org.apache.syncope.client.cli.commands.CommonsResultManager;
 import org.apache.syncope.client.cli.view.Table;
 import org.apache.syncope.common.lib.log.LogStatementTO;
@@ -42,7 +41,7 @@ public class LoggerResultManager extends CommonsResultManager {
         tableBuilder.build().print();
     }
 
-    public void fromGetLastLogStatements(final Queue<LogStatementTO> statements) throws JsonProcessingException {
+    public void fromGetLastLogStatements(final List<LogStatementTO> statements) throws JsonProcessingException {
         final Table.TableBuilder tableBuilder = new Table.TableBuilder("last statements").header("statement");
         for (final LogStatementTO statement : statements) {
             tableBuilder.rowValues(Collections.singletonList(

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java
index 823c6dd..0f1f15c 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.cli.commands.logger;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Queue;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.client.cli.SyncopeServices;
@@ -44,7 +43,7 @@ public class LoggerSyncopeOperations {
         }, new ArrayList<String>());
     }
 
-    public Queue<LogStatementTO> getLastLogStatements(final String appender) {
+    public List<LogStatementTO> getLastLogStatements(final String appender) {
         return loggerService.getLastLogStatements(appender);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java
index c96ee1c..820c6f9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java
@@ -20,24 +20,19 @@ package org.apache.syncope.client.console.pages;
 
 import static org.apache.wicket.Component.ENABLE;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import org.apache.commons.collections4.list.SetUniqueList;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.LogStatementPanel;
 import org.apache.syncope.client.console.rest.LoggerRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.common.lib.log.LogStatementTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.wicket.Application;
-import org.apache.wicket.ThreadContext;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
-import org.apache.wicket.event.IEvent;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.list.ListItem;
@@ -45,13 +40,7 @@ import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.util.ListModel;
-import org.apache.wicket.protocol.ws.WebSocketSettings;
-import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
-import org.apache.wicket.protocol.ws.api.WebSocketPushBroadcaster;
-import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
-import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
-import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage;
-import org.apache.wicket.protocol.ws.api.registry.IKey;
+import org.apache.wicket.util.time.Duration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,14 +54,6 @@ public class LogViewer extends WebPage {
 
     private final LoggerRestClient restClient = new LoggerRestClient();
 
-    private final IModel<Long> lastTimeInMillis = Model.of(0L);
-
-    private final WebMarkupContainer stContainer;
-
-    private final IModel<List<LogStatementTO>> statementViewModel;
-
-    private final ListView<LogStatementTO> statementView;
-
     public LogViewer() {
         final WebMarkupContainer viewer = new WebMarkupContainer("viewer");
         viewer.setOutputMarkupId(true);
@@ -84,12 +65,13 @@ public class LogViewer extends WebPage {
         appenders.setChoices(restClient.listMemoryAppenders());
         viewer.add(appenders);
 
-        stContainer = new WebMarkupContainer("stContainer");
+        final WebMarkupContainer stContainer = new WebMarkupContainer("stContainer");
         stContainer.setOutputMarkupId(true);
         viewer.add(stContainer);
 
-        statementViewModel = new ListModel<>(new ArrayList<LogStatementTO>());
-        statementView = new ListView<LogStatementTO>("statements", statementViewModel) {
+        final Model<Long> lastTimeInMillis = Model.of(0L);
+        final IModel<List<LogStatementTO>> statementViewModel = new ListModel<>(new ArrayList<LogStatementTO>());
+        final ListView<LogStatementTO> statementView = new ListView<LogStatementTO>("statements", statementViewModel) {
 
             private static final long serialVersionUID = -9180479401817023838L;
 
@@ -102,51 +84,21 @@ public class LogViewer extends WebPage {
         };
         statementView.setOutputMarkupId(true);
         stContainer.add(statementView);
+        stContainer.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(10)) {
 
-        appenders.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306810L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                List<LogStatementTO> lastStatements = appenders.getModelObject() == null
-                        ? new ArrayList<LogStatementTO>()
-                        : restClient.getLastLogStatements(appenders.getModelObject(), 0);
-                statementViewModel.setObject(lastStatements);
-                target.add(stContainer);
-
-                lastTimeInMillis.setObject(0L);
-            }
-        });
-
-        add(new WebSocketBehavior() {
-
-            private static final long serialVersionUID = 3507933905864454312L;
+            private static final long serialVersionUID = 7298597675929755960L;
 
             @Override
-            protected void onConnect(final ConnectedMessage message) {
-                super.onConnect(message);
-
-                SyncopeConsoleSession.get().scheduleAtFixedRate(
-                        new LogStatementUpdater(message, restClient, appenders, lastTimeInMillis),
-                        0, 10, TimeUnit.SECONDS);
-            }
-
-        });
-    }
-
-    @Override
-    public void onEvent(final IEvent<?> event) {
-        if (event.getPayload() instanceof WebSocketPushPayload) {
-            WebSocketPushPayload wsEvent = (WebSocketPushPayload) event.getPayload();
-            if (wsEvent.getMessage() instanceof LogViewerMessage) {
-                List<LogStatementTO> recentLogStatements =
-                        ((LogViewerMessage) wsEvent.getMessage()).getRecentLogStatements();
+            protected void onPostProcessTarget(final AjaxRequestTarget target) {
+                // save scroll position
+                target.prependJavaScript(
+                        String.format("window.scrollTop = $('#%s').scrollTop();", stContainer.getMarkupId()));
 
+                List<LogStatementTO> recentLogStatements = appenders.getModelObject() == null
+                        ? new ArrayList<LogStatementTO>()
+                        : restClient.getLastLogStatements(appenders.getModelObject(), lastTimeInMillis.getObject());
                 if (!recentLogStatements.isEmpty()) {
-                    // save scroll position
-                    wsEvent.getHandler().prependJavaScript(
-                            String.format("window.scrollTop = $('#%s').scrollTop();", stContainer.getMarkupId()));
+                    lastTimeInMillis.setObject(recentLogStatements.get(recentLogStatements.size() - 1).getTimeMillis());
 
                     int currentSize = statementView.getModelObject().size();
                     int recentSize = recentLogStatements.size();
@@ -156,88 +108,36 @@ public class LogViewer extends WebPage {
                     if (currentSize <= MAX_STATEMENTS_PER_APPENDER - recentSize) {
                         newModelObject.addAll(statementView.getModelObject());
                     } else {
-                        newModelObject.addAll(statementView.getModelObject().subList(recentSize, currentSize));
+                        newModelObject.addAll(statementView.getModelObject().
+                                subList(currentSize - (MAX_STATEMENTS_PER_APPENDER - recentSize), currentSize));
                     }
                     newModelObject.addAll(recentLogStatements);
 
                     statementViewModel.setObject(newModelObject);
-                    wsEvent.getHandler().add(LogViewer.this.stContainer);
+                    target.add(stContainer);
 
-                    // restore scroll position - might not work perfectly if items were removed from the top
-                    wsEvent.getHandler().appendJavaScript(
-                            String.format("$('#%s').scrollTop(window.scrollTop);", stContainer.getMarkupId()));
                 }
-            }
-        }
-    }
-
-    private static final class LogStatementUpdater implements Runnable {
-
-        private final Application application;
-
-        private final SyncopeConsoleSession session;
-
-        private final IKey key;
-
-        private final LoggerRestClient restClient;
-
-        private final AjaxDropDownChoicePanel<String> appenders;
-
-        private final IModel<Long> lastTimeInMillis;
 
-        LogStatementUpdater(
-                final ConnectedMessage message,
-                final LoggerRestClient restClient,
-                final AjaxDropDownChoicePanel<String> appenders,
-                final IModel<Long> lastTimeInMillis) {
+                // restore scroll position - might not work perfectly if items were removed from the top
+                target.appendJavaScript(
+                        String.format("$('#%s').scrollTop(window.scrollTop);", stContainer.getMarkupId()));
+            }
+        });
 
-            this.application = message.getApplication();
-            this.session = SyncopeConsoleSession.get();
-            this.key = message.getKey();
-            this.restClient = restClient;
-            this.appenders = appenders;
-            this.lastTimeInMillis = lastTimeInMillis;
-        }
+        appenders.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
-        @Override
-        public void run() {
-            try {
-                ThreadContext.setApplication(application);
-                ThreadContext.setSession(session);
+            private static final long serialVersionUID = -1107858522700306810L;
 
-                List<LogStatementTO> recentLogStatements = appenders.getModelObject() == null
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                List<LogStatementTO> lastStatements = appenders.getModelObject() == null
                         ? new ArrayList<LogStatementTO>()
-                        : restClient.getLastLogStatements(appenders.getModelObject(), lastTimeInMillis.getObject());
-                if (!recentLogStatements.isEmpty()) {
-                    lastTimeInMillis.setObject(recentLogStatements.get(recentLogStatements.size() - 1).getTimeMillis());
-                }
+                        : restClient.getLastLogStatements(appenders.getModelObject(), 0);
+                statementViewModel.setObject(lastStatements);
+                target.add(stContainer);
 
-                WebSocketSettings settings = WebSocketSettings.Holder.get(application);
-                WebSocketPushBroadcaster broadcaster = new WebSocketPushBroadcaster(settings.getConnectionRegistry());
-                broadcaster.broadcast(
-                        new ConnectedMessage(application, session.getId(), key),
-                        new LogViewerMessage(recentLogStatements));
-            } catch (Throwable t) {
-                LOG.error("Unexpected error while checking for recent log statements", t);
-            } finally {
-                ThreadContext.detach();
+                lastTimeInMillis.setObject(0L);
             }
-        }
-    }
-
-    private static class LogViewerMessage implements IWebSocketPushMessage, Serializable {
-
-        private static final long serialVersionUID = 7241149017008105769L;
-
-        private final List<LogStatementTO> recentLogStatements;
-
-        LogViewerMessage(final List<LogStatementTO> recentLogStatements) {
-            this.recentLogStatements = recentLogStatements;
-        }
-
-        public List<LogStatementTO> getRecentLogStatements() {
-            return recentLogStatements;
-        }
-
+        });
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
index 6ef4108..5dd4de5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
@@ -20,7 +20,10 @@ package org.apache.syncope.client.console.panels;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import org.apache.commons.collections4.ComparatorUtils;
+import org.apache.commons.collections4.Transformer;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.LoggerConfig;
@@ -49,19 +52,27 @@ public class ConsoleLogPanel extends AbstractLogsPanel<LoggerTO> {
         private static final long serialVersionUID = -1550459341476431714L;
 
         public List<LoggerTO> getLoggers() {
-            final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
+            LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
 
-            final List<LoggerTO> result = new ArrayList<>();
+            List<LoggerTO> result = new ArrayList<>();
             for (final LoggerConfig logger : ctx.getConfiguration().getLoggers().values()) {
-                final String loggerName = LogManager.ROOT_LOGGER_NAME.equals(logger.getName())
+                String loggerName = LogManager.ROOT_LOGGER_NAME.equals(logger.getName())
                         ? SyncopeConstants.ROOT_LOGGER : logger.getName();
                 if (logger.getLevel() != null) {
-                    final LoggerTO loggerTO = new LoggerTO();
+                    LoggerTO loggerTO = new LoggerTO();
                     loggerTO.setKey(loggerName);
                     loggerTO.setLevel(LoggerLevel.fromLevel(logger.getLevel()));
                     result.add(loggerTO);
                 }
             }
+            Collections.sort(result, ComparatorUtils.transformedComparator(
+                    ComparatorUtils.<String>naturalComparator(), new Transformer<LoggerTO, String>() {
+
+                @Override
+                public String transform(final LoggerTO input) {
+                    return input.getKey();
+                }
+            }));
 
             return result;
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java
index 1fc45a8..67a14ca 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/CoreLogPanel.java
@@ -18,11 +18,9 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.pages.LogViewer;
+import org.apache.syncope.client.console.rest.LoggerRestClient;
 import org.apache.syncope.common.lib.log.LoggerTO;
-import org.apache.syncope.common.lib.types.LoggerType;
-import org.apache.syncope.common.rest.api.service.LoggerService;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.link.PopupSettings;
@@ -31,8 +29,10 @@ public class CoreLogPanel extends AbstractLogsPanel<LoggerTO> {
 
     private static final long serialVersionUID = 3905038169553185171L;
 
+    private final LoggerRestClient restClient = new LoggerRestClient();
+
     public CoreLogPanel(final String id, final PageReference pageReference) {
-        super(id, pageReference, SyncopeConsoleSession.get().getService(LoggerService.class).list(LoggerType.LOG));
+        super(id, pageReference, new LoggerRestClient().listLogs());
 
         BookmarkablePageLink<Void> viewer = new BookmarkablePageLink<>("viewer", LogViewer.class);
         viewer.setPopupSettings(new PopupSettings().setHeight(600).setWidth(800));
@@ -41,6 +41,6 @@ public class CoreLogPanel extends AbstractLogsPanel<LoggerTO> {
 
     @Override
     protected void update(final LoggerTO loggerTO) {
-        SyncopeConsoleSession.get().getService(LoggerService.class).update(LoggerType.LOG, loggerTO);
+        restClient.setLogLevel(loggerTO);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
index bc31608..818a8d2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
@@ -26,10 +26,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import org.apache.commons.collections4.ComparatorUtils;
 import org.apache.commons.collections4.Transformer;
-import org.apache.commons.collections4.TransformerUtils;
 import org.apache.syncope.common.lib.log.EventCategoryTO;
 import org.apache.syncope.common.lib.log.LogAppender;
 import org.apache.syncope.common.lib.log.LogStatementTO;
@@ -56,18 +54,27 @@ public class LoggerRestClient extends BaseRestClient {
     }
 
     public List<LogStatementTO> getLastLogStatements(final String appender, final long lastStatementTime) {
-        return CollectionUtils.collect(IterableUtils.filteredIterable(
-                getService(LoggerService.class).getLastLogStatements(appender), new Predicate<LogStatementTO>() {
-
-            @Override
-            public boolean evaluate(final LogStatementTO object) {
-                return object.getTimeMillis() > lastStatementTime;
+        List<LogStatementTO> result = new ArrayList<>();
+        for (LogStatementTO statement : getService(LoggerService.class).getLastLogStatements(appender)) {
+            if (statement.getTimeMillis() > lastStatementTime) {
+                result.add(statement);
             }
-        }), TransformerUtils.<LogStatementTO>nopTransformer(), new ArrayList<LogStatementTO>());
+        }
+
+        return result;
     }
 
     public List<LoggerTO> listLogs() {
-        return getService(LoggerService.class).list(LoggerType.LOG);
+        List<LoggerTO> logs = getService(LoggerService.class).list(LoggerType.LOG);
+        Collections.sort(logs, ComparatorUtils.transformedComparator(
+                ComparatorUtils.<String>naturalComparator(), new Transformer<LoggerTO, String>() {
+
+            @Override
+            public String transform(final LoggerTO input) {
+                return input.getKey();
+            }
+        }));
+        return logs;
     }
 
     public List<AuditLoggerName> listAudits() {
@@ -87,10 +94,7 @@ public class LoggerRestClient extends BaseRestClient {
         return result;
     }
 
-    public void setLogLevel(final String key, final LoggerLevel level) {
-        LoggerTO loggerTO = new LoggerTO();
-        loggerTO.setKey(key);
-        loggerTO.setLevel(level);
+    public void setLogLevel(final LoggerTO loggerTO) {
         getService(LoggerService.class).update(LoggerType.LOG, loggerTO);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
index 7250b7a..4b9aa83 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.common.rest.api.service;
 
 import java.util.List;
-import java.util.Queue;
 import javax.validation.constraints.NotNull;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -60,7 +59,7 @@ public interface LoggerService extends JAXRSService {
     @GET
     @Path("memoryAppenders/{memoryAppender}/lastLogStatements")
     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    Queue<LogStatementTO> getLastLogStatements(@NotNull @PathParam("memoryAppender") String memoryAppender);
+    List<LogStatementTO> getLastLogStatements(@NotNull @PathParam("memoryAppender") String memoryAppender);
 
     /**
      * Returns the list of all managed events in audit.

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
index 0e3c887..5315ea9 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
@@ -23,12 +23,12 @@ import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Queue;
 import java.util.Set;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.IteratorUtils;
 import org.apache.commons.collections4.PredicateUtils;
 import org.apache.commons.collections4.Transformer;
+import org.apache.commons.collections4.TransformerUtils;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -124,13 +124,16 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.LOG_READ + "') and authentication.details.domain == "
             + "T(org.apache.syncope.common.lib.SyncopeConstants).MASTER_DOMAIN")
-    public Queue<LogStatementTO> getLastLogStatements(final String memoryAppender) {
+    public List<LogStatementTO> getLastLogStatements(final String memoryAppender) {
         MemoryAppender appender = loggerLoader.getMemoryAppenders().get(memoryAppender);
         if (appender == null) {
             throw new NotFoundException("Appender " + memoryAppender);
         }
 
-        return appender.getStatements();
+        return CollectionUtils.collect(
+                appender.getStatements(),
+                TransformerUtils.<LogStatementTO>nopTransformer(),
+                new ArrayList<LogStatementTO>());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.LOG_LIST + "') and authentication.details.domain == "

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerAccessor.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerAccessor.java b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerAccessor.java
index 8fadf47..47fa990 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerAccessor.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerAccessor.java
@@ -65,8 +65,9 @@ public class LoggerAccessor {
          * otherwise create a SyncopeLogger instance with given name and level.
          */
         for (LoggerConfig logConf : ctx.getConfiguration().getLoggers().values()) {
-            if (!LogManager.ROOT_LOGGER_NAME.equals(logConf.getName()) && logConf.getLevel() != null) {
-                String loggerName = logConf.getName();
+            String loggerName = LogManager.ROOT_LOGGER_NAME.equals(logConf.getName())
+                    ? SyncopeConstants.ROOT_LOGGER : logConf.getName();
+            if (logConf.getLevel() != null) {
                 if (syncopeLoggers.containsKey(loggerName)) {
                     logConf.setLevel(syncopeLoggers.get(loggerName).getLevel().getLevel());
                     syncopeLoggers.remove(loggerName);
@@ -74,9 +75,7 @@ public class LoggerAccessor {
                     Logger syncopeLogger = entityFactory.newEntity(Logger.class);
                     syncopeLogger.setKey(loggerName);
                     syncopeLogger.setLevel(LoggerLevel.fromLevel(logConf.getLevel()));
-                    syncopeLogger.setType(loggerName.startsWith(LoggerType.AUDIT.getPrefix())
-                            ? LoggerType.AUDIT
-                            : LoggerType.LOG);
+                    syncopeLogger.setType(LoggerType.LOG);
                     loggerDAO.save(syncopeLogger);
                 }
             }
@@ -87,9 +86,9 @@ public class LoggerAccessor {
          */
         for (Logger syncopeLogger : syncopeLoggers.values()) {
             LoggerConfig logConf = ctx.getConfiguration().getLoggerConfig(syncopeLogger.getKey());
-            if (!LogManager.ROOT_LOGGER_NAME.equals(logConf.getName()) && logConf.getLevel() != null) {
-                logConf.setLevel(syncopeLogger.getLevel().getLevel());
-            }
+            logConf.setLevel(syncopeLogger.getLevel().getLevel());
         }
+
+        ctx.updateLoggers();
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
index bc406ed..c62a55c 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.rest.cxf.service;
 
 import java.text.ParseException;
 import java.util.List;
-import java.util.Queue;
 import javax.ws.rs.BadRequestException;
 import org.apache.syncope.common.lib.log.EventCategoryTO;
 import org.apache.syncope.common.lib.log.LogAppender;
@@ -46,7 +45,7 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
     }
 
     @Override
-    public Queue<LogStatementTO> getLastLogStatements(final String memoryAppender) {
+    public List<LogStatementTO> getLastLogStatements(final String memoryAppender) {
         return logic.getLastLogStatements(memoryAppender);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/fit/core-reference/src/main/resources/log4j2.xml
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/log4j2.xml b/fit/core-reference/src/main/resources/log4j2.xml
index d8a0c6c..9b58bc5 100644
--- a/fit/core-reference/src/main/resources/log4j2.xml
+++ b/fit/core-reference/src/main/resources/log4j2.xml
@@ -85,6 +85,10 @@ under the License.
       <appender-ref ref="persistenceFile"/>
       <appender-ref ref="persistence"/>
     </asyncLogger>
+    <asyncLogger name="org.apache.ibatis" additivity="false" level="INFO">
+      <appender-ref ref="persistenceFile"/>
+      <appender-ref ref="persistence"/>
+    </asyncLogger>
     
     <asyncLogger name="org.apache.syncope.core.rest" additivity="false" level="INFO">
       <appender-ref ref="restFile"/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/cbe4b703/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
index d534764..7e38c19 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
@@ -26,7 +26,6 @@ import static org.junit.Assert.fail;
 
 import java.text.ParseException;
 import java.util.List;
-import java.util.Queue;
 import javax.ws.rs.core.Response;
 import javax.xml.ws.WebServiceException;
 import org.apache.commons.collections4.IterableUtils;
@@ -66,11 +65,11 @@ public class LoggerITCase extends AbstractITCase {
 
     @Test
     public void lastStatements() {
-        Queue<LogStatementTO> statements = loggerService.getLastLogStatements("connid");
+        List<LogStatementTO> statements = loggerService.getLastLogStatements("connid");
         assertNotNull(statements);
         assertFalse(statements.isEmpty());
 
-        LogStatementTO statement = statements.element();
+        LogStatementTO statement = statements.get(0);
         assertNotNull(statement);
         assertNotNull(statement.getLoggerName());
         assertNotNull(statement.getLevel());