Fix: add LTTngEvent class to fix delayed logger
[lttng-ust.git] / liblttng-ust-jul / org / lttng / ust / jul / LTTngLogHandler.java
index dfc15b3df65115fbf91879ceac5bf5f3f7737616..f61677d0b3b270e96a07fef07a817ef73f00c33c 100644 (file)
@@ -21,12 +21,34 @@ import java.lang.String;
 import java.util.logging.Handler;
 import java.util.logging.LogRecord;
 import java.util.logging.LogManager;
+import java.util.logging.Level;
+import java.util.HashMap;
 
 import org.lttng.ust.jul.LTTngUst;
 
+/* Note: This is taken from the LTTng tools ABI. */
+class LTTngLogLevelABI {
+       /* Loglevel type. */
+       public static final int LOGLEVEL_TYPE_ALL = 0;
+       public static final int LOGLEVEL_TYPE_RANGE = 1;
+       public static final int LOGLEVEL_TYPE_SINGLE = 2;
+}
+
 public class LTTngLogHandler extends Handler {
+       /*
+        * Indicate if the enable all event has been seen and if yes logger that we
+        * enabled should use the loglevel/type below.
+        */
+       public int logLevelUseAll = 0;
+       public int logLevelAll = 0;
+       public int logLevelTypeAll;
+
        public LogManager logManager;
 
+       /* Indexed by name and corresponding LTTngEvent. */
+       private HashMap<String, LTTngEvent> eventMap =
+               new HashMap<String, LTTngEvent>();
+
        public LTTngLogHandler(LogManager logManager) {
                super();
 
@@ -36,6 +58,10 @@ public class LTTngLogHandler extends Handler {
                LTTngUst.init();
        }
 
+       public void setEvent(LTTngEvent event) {
+               eventMap.put(event.name, event);
+       }
+
        @Override
        public void close() throws SecurityException {}
 
@@ -44,6 +70,42 @@ public class LTTngLogHandler extends Handler {
 
        @Override
        public void publish(LogRecord record) {
+               int fire_tp = 0, rec_log_level, ev_type, ev_log_level;
+               LTTngEvent event;
+               LTTngLogLevel lttngLogLevel;
+               String logger_name = record.getLoggerName();
+
+               /* Get back the event if any and check for loglevel. */
+               event = eventMap.get(logger_name);
+               if (event != null) {
+                       rec_log_level = record.getLevel().intValue();
+                       ev_log_level = event.logLevel.level;
+                       ev_type = event.logLevel.type;
+
+                       switch (ev_type) {
+                       case LTTngLogLevelABI.LOGLEVEL_TYPE_RANGE:
+                               if (ev_log_level <= rec_log_level) {
+                                       fire_tp = 1;
+                               }
+                               break;
+                       case LTTngLogLevelABI.LOGLEVEL_TYPE_SINGLE:
+                               if (ev_log_level == rec_log_level) {
+                                       fire_tp = 1;
+                               }
+                               break;
+                       case LTTngLogLevelABI.LOGLEVEL_TYPE_ALL:
+                               fire_tp = 1;
+                               break;
+                       }
+               } else {
+                       /* No loglevel attached thus fire tracepoint. */
+                       fire_tp = 1;
+               }
+
+               if (fire_tp == 0) {
+                       return;
+               }
+
                /*
                 * Specific tracepoing designed for JUL events. The source class of the
                 * caller is used for the event name, the raw message is taken, the
This page took 0.041373 seconds and 4 git commands to generate.