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();
LTTngUst.init();
}
+ public void setEvent(LTTngEvent event) {
+ eventMap.put(event.name, event);
+ }
+
@Override
public void close() throws SecurityException {}
@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