package ch.qos.logback.reflect; import org.codehaus.janino.ExpressionEvaluator; import org.codehaus.janino.Parser.ParseException; import org.codehaus.janino.Scanner.ScanException; import org.codehaus.janino.samples.DemoBase; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.LoggingEvent; public class JaninoTest { /** * @param args * @throws ScanException * @throws ParseException * @throws Exception */ public static void main(String[] args) throws Exception { String expression = "import ch.qos.logback.classic.Level; e.getLevel().levelInt <= Level.INFO.levelInt"; Class optionalExpressionType = boolean.class; String[] parameterNames = {"e"}; Class[] parameterTypes = {LoggingEvent.class}; Class[] thrownExceptions = new Class[0]; // Create "ExpressionEvaluator" object. ExpressionEvaluator ee = new ExpressionEvaluator(expression, optionalExpressionType, parameterNames, parameterTypes, thrownExceptions, null // optionalClassLoader ); Object[] parameterValues = new Object[1]; LoggerContext lc = new LoggerContext(); Logger logger = lc.getLogger(JaninoTest.class); LoggingEvent loggingEvent = new LoggingEvent("toto", logger, Level.INFO, "hi", null); parameterValues[0] = loggingEvent; Object res = ee.evaluate(parameterValues); // Print expression result. System.out.println("Result = " + DemoBase.toString(res)); System.out.println("Type = " + res.getClass().getName()); loop(ee, parameterValues); // loggingEvent.getMarker() expression = "import ch.qos.logback.classic.Level; (e.getMarker() != null) && (e.getMarker().contains(\"yo\"))"; ee = new ExpressionEvaluator(expression, optionalExpressionType, parameterNames, parameterTypes, thrownExceptions, null); res = ee.evaluate(parameterValues); // Print expression result. System.out.println("Result = " + DemoBase.toString(res)); System.out.println("Type = " + res.getClass().getName()); loop(ee, parameterValues); } static void loop(ExpressionEvaluator ee, Object[] parameterValues) throws Exception { final long start = System.nanoTime(); final long LEN = 1000 * 1000; for (int i = 0; i < LEN; i++) { ee.evaluate(parameterValues); } final long end = System.nanoTime(); System.out.println("abg: " + (end - start) / LEN + " nanos"); } }