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}