import java.util.logging.LogRecord;
import java.util.logging.LogManager;
import java.util.logging.Level;
+import java.util.ArrayList;
import java.util.HashMap;
import org.lttng.ust.jul.LTTngUst;
public static final int LOGLEVEL_TYPE_SINGLE = 2;
}
-class LTTngLogLevel {
- /* Event name on which this loglevel is applied on. */
- private String event_name;
- /* This level is a JUL int level value. */
- private int level;
- private int type;
-
- public LTTngLogLevel(String event_name, int level, int type) {
- this.event_name = event_name;
- this.type = type;
- this.level = level;
- }
-
- public String getName() {
- return this.event_name;
- }
-
- public int getLevel() {
- return this.level;
- }
+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 ArrayList<LTTngLogLevel> logLevelsAll =
+ new ArrayList<LTTngLogLevel>();
- public int getType() {
- return this.type;
- }
-}
+ /* Am I a root Log Handler. */
+ public int is_root = 0;
-public class LTTngLogHandler extends Handler {
public LogManager logManager;
- private HashMap<String, LTTngLogLevel> logLevels =
- new HashMap<String, LTTngLogLevel>();
+ /* Indexed by name and corresponding LTTngEvent. */
+ private HashMap<String, LTTngEvent> eventMap =
+ new HashMap<String, LTTngEvent>();
public LTTngLogHandler(LogManager logManager) {
super();
LTTngUst.init();
}
- public void setLogLevel(String event_name, int level, int type) {
- LTTngLogLevel lttngLogLevel = new LTTngLogLevel(event_name, level,
- type);
- logLevels.put(event_name, lttngLogLevel);
+ /**
+ * Add event to handler hash map if new.
+ *
+ * @return 0 if it did not exist else 1.
+ */
+ public int setEvent(LTTngEvent new_event) {
+ LTTngEvent event;
+
+ event = eventMap.get(new_event.name);
+ if (event == null) {
+ eventMap.put(new_event.name, new_event);
+ /* Did not exists. */
+ return 0;
+ } else {
+ /* Add new event loglevel to existing event. */
+ event.logLevels.addAll(new_event.logLevels);
+ /* Already exists. */
+ return 1;
+ }
+ }
+
+ /*
+ * Cleanup this handler state meaning put it back to a vanilla state.
+ */
+ public void clear() {
+ this.eventMap.clear();
+ this.logLevelsAll.clear();
}
@Override
@Override
public void publish(LogRecord record) {
int fire_tp = 0, rec_log_level, ev_type, ev_log_level;
+ LTTngEvent event;
LTTngLogLevel lttngLogLevel;
- String event_name = record.getLoggerName();
-
- lttngLogLevel = logLevels.get(event_name);
- if (lttngLogLevel != null) {
- rec_log_level = record.getLevel().intValue();
- ev_log_level = lttngLogLevel.getLevel();
- ev_type = lttngLogLevel.getType();
-
- switch (ev_type) {
- case LTTngLogLevelABI.LOGLEVEL_TYPE_RANGE:
- if (ev_log_level <= rec_log_level) {
+ String logger_name = record.getLoggerName();
+
+ /* Get back the event if any and check for loglevel. */
+ event = eventMap.get(logger_name);
+ if (event != null) {
+ for (LTTngLogLevel ev_log : event.logLevels) {
+ /* Get record and event log level. */
+ rec_log_level = record.getLevel().intValue();
+ ev_log_level = ev_log.level;
+
+ switch (ev_log.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;
}
- break;
- case LTTngLogLevelABI.LOGLEVEL_TYPE_SINGLE:
- if (ev_log_level == rec_log_level) {
- fire_tp = 1;
+
+ /*
+ * If we match, stop right now else continue to the next
+ * loglevel contained in the event.
+ */
+ if (fire_tp == 1) {
+ break;
}
- break;
- case LTTngLogLevelABI.LOGLEVEL_TYPE_ALL:
- fire_tp = 1;
- break;
}
} else {
/* No loglevel attached thus fire tracepoint. */
* caller is used for the event name, the raw message is taken, the
* loglevel of the record and the thread ID.
*/
- LTTngUst.tracepoint(record.getMessage(), record.getLoggerName(),
- record.getSourceClassName(), record.getSourceMethodName(),
- record.getMillis(), record.getLevel().intValue(),
- record.getThreadID());
+ if (this.is_root == 1) {
+ LTTngUst.tracepointS(record.getMessage(),
+ record.getLoggerName(), record.getSourceClassName(),
+ record.getSourceMethodName(), record.getMillis(),
+ record.getLevel().intValue(), record.getThreadID());
+ } else {
+ LTTngUst.tracepointU(record.getMessage(),
+ record.getLoggerName(), record.getSourceClassName(),
+ record.getSourceMethodName(), record.getMillis(),
+ record.getLevel().intValue(), record.getThreadID());
+ }
}
}