assertFileExistance(files); assertEquals("Incorrect number of appenders with IdlePurgePolicy.", 3, routingAppenderIdle.getAppenders().size()); assertEquals("Incorrect number of appenders with IdlePurgePolicy with HangingAppender.", 3, routingAppenderIdleWithHangingAppender.getAppenders().size()); assertEquals("Incorrect number of appenders manual purge.", 3, routingAppenderManual.getAppenders().size()); assertEquals("Incorrect number of appenders with IdlePurgePolicy.", 1, routingAppenderIdle.getAppenders().size()); assertEquals("Incorrect number of appenders with manual purge.", 3, routingAppenderManual.getAppenders().size()); routingAppenderManual.deleteAppender("1"); routingAppenderManual.deleteAppender("2"); routingAppenderManual.deleteAppender("3"); assertEquals("Incorrect number of appenders with IdlePurgePolicy.", 1, routingAppenderIdle.getAppenders().size()); assertEquals("Incorrect number of appenders with manual purge.", 0, routingAppenderManual.getAppenders().size()); assertEquals("Incorrect number of appenders with manual purge.", 1, routingAppenderManual.getAppenders().size()); routingAppenderManual.deleteAppender("5"); routingAppenderManual.deleteAppender("5"); assertEquals("Incorrect number of appenders with manual purge.", 0, routingAppenderManual.getAppenders().size());
@Test public void testRoutingAppenderRoutes() { final RoutingAppender routingAppender = getRoutingAppender(); Assert.assertEquals(expectBindingEntries, routingAppender.getDefaultRouteScript() != null); Assert.assertEquals(expectBindingEntries, routingAppender.getDefaultRoute() != null); final Routes routes = routingAppender.getRoutes(); Assert.assertNotNull(routes); Assert.assertNotNull(routes.getPatternScript()); final LogEvent logEvent = DefaultLogEventFactory.getInstance().createEvent("", null, "", Level.ERROR, null, null, null); Assert.assertEquals("Service2", routes.getPattern(logEvent, new ConcurrentHashMap<>())); }
private ListAppender getListAppender() { final String key = "Service2"; final RoutingAppender routingAppender = getRoutingAppender(); Assert.assertTrue(routingAppender.isStarted()); final Map<String, AppenderControl> appenders = routingAppender.getAppenders(); final AppenderControl appenderControl = appenders.get(key); assertNotNull("No appender control generated for '" + key + "'; appenders = " + appenders, appenderControl); final ListAppender listAppender = (ListAppender) appenderControl.getAppender(); return listAppender; }
@Test public void testRoutingAppenderDefaultRouteKey() { final RoutingAppender routingAppender = getRoutingAppender(); Assert.assertNotNull(routingAppender.getDefaultRouteScript()); Assert.assertNotNull(routingAppender.getDefaultRoute()); Assert.assertEquals("Service2", routingAppender.getDefaultRoute().getKey()); }
/** * Indicate that the specified key is no longer used. * @param key */ private void keyComplete(String key) { Preconditions.checkNotNull(key, "Key must be specified"); boolean removed = knownAppenders.remove(key); if (removed) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Deleting Appender for key: " + key); } routingAppender.deleteAppender(key); } else { LOGGER.trace("Ignoring call to remove unknown key: " + key); } }
RoutingAppender routingAppender = RoutingAppender.createAppender(TEST_QUERY_ROUTING_APPENDER, "true", routes, loggerConfig.addAppender(routingAppender, null, null); context.updateLoggers(); routingAppender.start();
@Test public void testListAppenderPresence() { // No appender until an event is routed, even thought we initialized the default route on startup. Assert.assertNull("No appender control generated", getRoutingAppender().getAppenders().get("Service2")); }
private synchronized AppenderControl getControl(final String key, final LogEvent event) { AppenderControl control = appenders.get(key); if (control != null) { return control; } Route route = null; for (final Route r : routes.getRoutes()) { if (r.getAppenderRef() == null && key.equals(r.getKey())) { route = r; break; } } if (route == null) { route = defaultRoute; control = appenders.get(DEFAULT_KEY); if (control != null) { return control; } } if (route != null) { final Appender app = createAppender(route, event); if (app == null) { return null; } control = new AppenderControl(app, null, null); appenders.put(key, control); } return control; }
private Appender createAppender(final Route route, final LogEvent event) { final Node routeNode = route.getNode(); for (final Node node : routeNode.getChildren()) { if (node.getType().getElementName().equals(Appender.ELEMENT_TYPE)) { final Node appNode = new Node(node); configuration.createConfiguration(appNode, event); if (appNode.getObject() instanceof Appender) { final Appender app = appNode.getObject(); app.start(); return app; } error("Unable to create Appender of type " + node.getName()); return null; } } error("No Appender was configured for route " + route.getKey()); return null; }
@Override public RoutingAppender build() { final String name = getName(); if (name == null) { LOGGER.error("No name defined for this RoutingAppender"); return null; } if (routes == null) { LOGGER.error("No routes defined for RoutingAppender {}", name); return null; } return new RoutingAppender(name, getFilter(), isIgnoreExceptions(), routes, rewritePolicy, getConfiguration(), purgePolicy, defaultRouteScript); }
@Override public void append(LogEvent event) { if (rewritePolicy != null) { event = rewritePolicy.rewrite(event); } final String pattern = routes.getPattern(event, scriptStaticVariables); final String key = pattern != null ? configuration.getStrSubstitutor().replace(event, pattern) : defaultRoute.getKey(); final AppenderControl control = getControl(key, event); if (control != null) { control.callAppender(event); } if (purgePolicy != null) { purgePolicy.update(key, event); } }
/** * Indicate that the specified key is no longer used. * @param key */ private void keyComplete(String key) { Preconditions.checkNotNull(key, "Key must be specified"); boolean removed = knownAppenders.remove(key); if (removed) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Deleting Appender for key: " + key); } routingAppender.deleteAppender(key); } else { LOGGER.trace("Ignoring call to remove unknown key: " + key); } }
private ListAppender getListAppender() { final String key = "Service2"; final RoutingAppender routingAppender = getRoutingAppender(); Assert.assertTrue(routingAppender.isStarted()); final Map<String, AppenderControl> appenders = routingAppender.getAppenders(); final AppenderControl appenderControl = appenders.get(key); assertNotNull("No appender control generated for '" + key + "'; appenders = " + appenders, appenderControl); final ListAppender listAppender = (ListAppender) appenderControl.getAppender(); return listAppender; }
Configuration configuration = context.getConfiguration(); RoutingAppender routingAppender = RoutingAppender.createAppender(QUERY_ROUTING_APPENDER, "true", routes, loggerConfig.addAppender(routingAppender, null, null); context.updateLoggers(); routingAppender.start();
@Test public void testListAppenderPresence() { // No appender until an event is routed, even thought we initialized the default route on startup. Assert.assertNull("No appender control generated", getRoutingAppender().getAppenders().get("Service2")); }
private RoutingAppender(final String name, final Filter filter, final boolean ignoreExceptions, final Routes routes, final RewritePolicy rewritePolicy, final Configuration configuration, final PurgePolicy purgePolicy, final AbstractScript defaultRouteScript) { super(name, filter, null, ignoreExceptions); this.routes = routes; this.configuration = configuration; this.rewritePolicy = rewritePolicy; this.purgePolicy = purgePolicy; if (this.purgePolicy != null) { this.purgePolicy.initialize(this); } this.defaultRouteScript = defaultRouteScript; Route defRoute = null; for (final Route route : routes.getRoutes()) { if (route.getKey() == null) { if (defRoute == null) { defRoute = route; } else { error("Multiple default routes. Route " + route.toString() + " will be ignored"); } } } defaultRoute = defRoute; }
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B> implements org.apache.logging.log4j.core.util.Builder<RoutingAppender> { // Does not work unless the element is called "Script", I wanted "DefaultRounteScript"... @PluginElement("Script") private AbstractScript defaultRouteScript; @PluginElement("Routes") private Routes routes; @PluginElement("RewritePolicy") private RewritePolicy rewritePolicy; @PluginElement("PurgePolicy") private PurgePolicy purgePolicy; @Override public RoutingAppender build() { final String name = getName(); if (name == null) { LOGGER.error("No name defined for this RoutingAppender"); return null; } if (routes == null) { LOGGER.error("No routes defined for RoutingAppender {}", name); return null; } return new RoutingAppender(name, getFilter(), isIgnoreExceptions(), routes, rewritePolicy, getConfiguration(), purgePolicy, defaultRouteScript); }
/** * Delete the oldest appenders (sorted by their last access time) until there are maxSize appenders or less. */ @Override public void purge() { synchronized (this) { Iterator<String> iterator = appendersUsage.keySet().iterator(); while (appendersUsage.size() > maxSize) { String key = iterator.next(); LOGGER.debug("Removing appender " + key); iterator.remove(); routingAppender.getAppenders().get(key).getAppender().stop(); routingAppender.deleteAppender(key); } } }
/** * Purging appenders that were not in use specified time */ @Override public void purge() { final long createTime = System.currentTimeMillis() - timeToLive; for (final Entry<String, Long> entry : appendersUsage.entrySet()) { if (entry.getValue() < createTime) { LOGGER.debug("Removing appender " + entry.getKey()); if (appendersUsage.remove(entry.getKey(), entry.getValue())) { routingAppender.deleteAppender(entry.getKey()); } } } }
if (defaultRouteScript != null) { if (configuration == null) { error("No Configuration defined for RoutingAppender; required for Script element."); } else { final ScriptManager scriptManager = configuration.getScriptManager(); appenders.put(key, new AppenderControl(appender, null, null)); } else { error("Appender " + route.getAppenderRef() + " cannot be located. Route ignored");