From 460701148b33878a040c1d7fd1bc77613eb34c92 Mon Sep 17 00:00:00 2001 From: Alexandre Montplaisir Date: Thu, 2 Jun 2016 03:29:48 -0400 Subject: [PATCH] Fix: Include child loggers in the output of "lttng list" 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 Signed-off-by: Mathieu Desnoyers --- .../lttng/ust/agent/jul/LttngJulAgent.java | 21 ++++++++++++++-- .../ust/agent/log4j/LttngLog4jAgent.java | 24 ++++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-jul/org/lttng/ust/agent/jul/LttngJulAgent.java b/liblttng-ust-java-agent/java/lttng-ust-agent-jul/org/lttng/ust/agent/jul/LttngJulAgent.java index 597ae6b3..1e104bca 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-jul/org/lttng/ust/agent/jul/LttngJulAgent.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-jul/org/lttng/ust/agent/jul/LttngJulAgent.java @@ -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 { @Override public Collection listAvailableEvents() { - List ret = new ArrayList(); + Set ret = new TreeSet(); List loggersNames = Collections.list(LogManager.getLogManager().getLoggerNames()); for (String name : loggersNames) { @@ -57,7 +59,7 @@ class LttngJulAgent extends AbstractLttngAgent { * 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 { 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; } diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-log4j/org/lttng/ust/agent/log4j/LttngLog4jAgent.java b/liblttng-ust-java-agent/java/lttng-ust-agent-log4j/org/lttng/ust/agent/log4j/LttngLog4jAgent.java index 6cb74f91..7677e68e 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-log4j/org/lttng/ust/agent/log4j/LttngLog4jAgent.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-log4j/org/lttng/ust/agent/log4j/LttngLog4jAgent.java @@ -17,12 +17,14 @@ 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 { @Override public Collection listAvailableEvents() { - List ret = new ArrayList(); + Set ret = new TreeSet(); @SuppressWarnings("unchecked") List loggers = Collections.list(LogManager.getCurrentLoggers()); @@ -71,7 +73,7 @@ class LttngLog4jAgent extends AbstractLttngAgent { return ret; } - private static boolean hasLttngAppenderAttached(Logger logger) { + private static boolean hasLttngAppenderAttached(Category logger) { @SuppressWarnings("unchecked") List appenders = Collections.list(logger.getAllAppenders()); for (Appender appender : appenders) { @@ -79,6 +81,22 @@ class LttngLog4jAgent extends AbstractLttngAgent { 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; } + } -- 2.34.1