Fix: Include child loggers in the output of "lttng list"
authorAlexandre Montplaisir <alexmonthy@efficios.com>
Thu, 2 Jun 2016 07:29:48 +0000 (03:29 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 2 Jun 2016 13:21:34 +0000 (15:21 +0200)
The case where a parent logger has an handler attached but the
tracepoint comes from a child logger is not correctly handled
by the "lttng list -j/-l" command.

For example, if the logger "org.myapp" has a LTTng handler
attached, its child logger "org.myapp.mycomponent" would be
absent from the lttng list output even if it exists.

When checking for events to list, search through the parent
tree of each logger to find a potential LTTng handler.

This should also fix the problem of "lttng list" always
returning empty when the deprecated, but still supported,
LTTngAgent API was used, since that one attaches only one
handler to the root logger.

Signed-off-by: Alexandre Montplaisir <alexmonthy@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust-java-agent/java/lttng-ust-agent-jul/org/lttng/ust/agent/jul/LttngJulAgent.java
liblttng-ust-java-agent/java/lttng-ust-agent-log4j/org/lttng/ust/agent/log4j/LttngLog4jAgent.java

index 597ae6b3e8228a694b2cf1ac532e181705c40555..1e104bca47a15ee8830e53dbbd17d5f92711dbab 100644 (file)
@@ -21,6 +21,8 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
 import java.util.logging.Handler;
 import java.util.logging.LogManager;
 import java.util.logging.Logger;
@@ -49,7 +51,7 @@ class LttngJulAgent extends AbstractLttngAgent<LttngLogHandler> {
 
        @Override
        public Collection<String> listAvailableEvents() {
-               List<String> ret = new ArrayList<String>();
+               Set<String> ret = new TreeSet<String>();
 
                List<String> loggersNames = Collections.list(LogManager.getLogManager().getLoggerNames());
                for (String name : loggersNames) {
@@ -57,7 +59,7 @@ class LttngJulAgent extends AbstractLttngAgent<LttngLogHandler> {
                         * Skip the root logger. An empty string is not a valid event name
                         * in LTTng.
                         */
-                       if (name.equals("")) {
+                       if (name.equals("") || name.equals("global")) {
                                continue;
                        }
 
@@ -79,6 +81,21 @@ class LttngJulAgent extends AbstractLttngAgent<LttngLogHandler> {
                                return true;
                        }
                }
+
+               /*
+                * A parent logger, if any, may be connected to an LTTng handler. In
+                * this case, we will want to include this child logger in the output,
+                * since it will be accessible by LTTng.
+                */
+               Logger parent = logger.getParent();
+               if (parent != null) {
+                       return hasLttngHandlerAttached(parent);
+               }
+
+               /*
+                * We have reached the root logger and have not found any LTTng handler,
+                * this event will not be accessible.
+                */
                return false;
        }
 
index 6cb74f91b5516864c1cc35403a1e8ff525cdda38..7677e68ee66e2b2c20773e0675654d24e49f7f46 100644 (file)
 
 package org.lttng.ust.agent.log4j;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
 
 import org.apache.log4j.Appender;
+import org.apache.log4j.Category;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.lttng.ust.agent.AbstractLttngAgent;
@@ -50,7 +52,7 @@ class LttngLog4jAgent extends AbstractLttngAgent<LttngLogAppender> {
 
        @Override
        public Collection<String> listAvailableEvents() {
-               List<String> ret = new ArrayList<String>();
+               Set<String> ret = new TreeSet<String>();
 
                @SuppressWarnings("unchecked")
                List<Logger> loggers = Collections.list(LogManager.getCurrentLoggers());
@@ -71,7 +73,7 @@ class LttngLog4jAgent extends AbstractLttngAgent<LttngLogAppender> {
                return ret;
        }
 
-       private static boolean hasLttngAppenderAttached(Logger logger) {
+       private static boolean hasLttngAppenderAttached(Category logger) {
                @SuppressWarnings("unchecked")
                List<Appender> appenders = Collections.list(logger.getAllAppenders());
                for (Appender appender : appenders) {
@@ -79,6 +81,22 @@ class LttngLog4jAgent extends AbstractLttngAgent<LttngLogAppender> {
                                return true;
                        }
                }
+
+               /*
+                * A parent logger, if any, may be connected to an LTTng handler. In
+                * this case, we will want to include this child logger in the output,
+                * since it will be accessible by LTTng.
+                */
+               Category parent = logger.getParent();
+               if (parent != null) {
+                       return hasLttngAppenderAttached(parent);
+               }
+
+               /*
+                * We have reached the root logger and have not found any LTTng handler,
+                * this event will not be accessible.
+                */
                return false;
        }
+
 }
This page took 0.027397 seconds and 4 git commands to generate.