AgentPremain.java revision 8f3f8818814e1cd403a252fce527b1439147dd80
1cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersenpackage org.slf4j.agent;
2cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersen
3cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersenimport static org.slf4j.helpers.MessageFormatter.format;
4cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersen
51adb4e0c1aa8507a14e69f57cb61698f9b0e0859Thorbjorn Ravn Andersenimport java.io.ByteArrayInputStream;
61adb4e0c1aa8507a14e69f57cb61698f9b0e0859Thorbjorn Ravn Andersenimport java.io.IOException;
7cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersenimport java.lang.instrument.Instrumentation;
8cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersenimport java.util.Date;
91adb4e0c1aa8507a14e69f57cb61698f9b0e0859Thorbjorn Ravn Andersenimport java.util.Properties;
10cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersen
11cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersenimport org.slf4j.instrumentation.LogTransformer;
12cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersen
13cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersenpublic class AgentPremain {
14cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersen
15864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  private static final String START_MSG = "Start at {}";
16864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  private static final String STOP_MSG = "Stop at {}, execution time = {} ms";
17864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
18864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  /**
19864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   * JavaAgent premain entry point as specified in the MANIFEST.MF file. See
208f3f8818814e1cd403a252fce527b1439147dd80Thorbjorn Ravn Andersen   * {@link http
218f3f8818814e1cd403a252fce527b1439147dd80Thorbjorn Ravn Andersen   * ://java.sun.com/javase/6/docs/api/java/lang/instrument/package-summary
228f3f8818814e1cd403a252fce527b1439147dd80Thorbjorn Ravn Andersen   * .html} for details.
23864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   *
24864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   * @param agentArgument
25864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   *          string provided after "=" up to first space
26864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   * @param instrumentation
278f3f8818814e1cd403a252fce527b1439147dd80Thorbjorn Ravn Andersen   *          instrumentation environment provided by the JVM
28864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   */
29864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  public static void premain(String agentArgument,
30864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      Instrumentation instrumentation) {
31864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
32864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    System.err.println("THIS JAVAAGENT IS NOT RELEASED YET.  "
33864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen        + "DO NOT USE IN PRODUCTION ENVIRONMENTS.");
34864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
35864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    LogTransformer.Builder builder = new LogTransformer.Builder();
36864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    builder = builder.addEntryExit(true);
37864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
38864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    if (agentArgument != null) {
39864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      Properties args = parseArguments(agentArgument);
40864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
41864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      if (args.containsKey("verbose")) {
42864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen        builder = builder.verbose(true);
43864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      }
44864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
45864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      if (args.containsKey("time")) {
46864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen        printStartStopTimes();
47864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      }
48864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
49864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      if (args.containsKey("ignore")) {
50864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen        builder = builder.ignore(args.getProperty("ignore").split(","));
51864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      }
52864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
53864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      if (args.containsKey("level")) {
54864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen        builder = builder.level(args.getProperty("level"));
55864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      }
56864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
57864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      // ... more agent option handling here
58864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    }
59864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
60864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    instrumentation.addTransformer(builder.build());
61864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  }
62864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
63864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  private static Properties parseArguments(String agentArgument) {
64864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    Properties p = new Properties();
65864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    try {
66864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      byte[] bytes = agentArgument.replaceAll(";", "\n").getBytes();
67864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      p.load(new ByteArrayInputStream(bytes));
68864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    } catch (IOException e) {
69864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      String s = "Could not load arguments as properties";
70864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      throw new RuntimeException(s, e);
71864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    }
72864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    return p;
73864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  }
74864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
75864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  /**
76864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   * Print the start message with the time NOW, and register a shutdown hook
77864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   * which will print the stop message with the time then and the number of
78864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   * milliseconds passed since.
79864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   *
80864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen   */
81864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  private static void printStartStopTimes() {
82864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    final long start = System.currentTimeMillis();
83864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    System.err.println(format(START_MSG, new Date()));
84864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen
85864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    Thread hook = new Thread() {
86864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      @Override
87864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      public void run() {
88864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen        long timePassed = System.currentTimeMillis() - start;
89864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen        String message = format(STOP_MSG, new Date(), timePassed);
90864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen        System.err.println(message);
91864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen      }
92864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    };
93864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen    Runtime.getRuntime().addShutdownHook(hook);
94864af74b88c29f18244ba6dfb61636be7f120baaThorbjorn Ravn Andersen  }
95cdfaeefef04d5b1500e897ecc75982a5316407e8Thorbjorn Ravn Andersen}