/** {@inheritDoc} */ @Nullable @Override public String fileName() { for (Logger log = impl; log != null; log = log.getParent()) { for (Appender a : log.getAppenders().values()) { if (a instanceof FileAppender) return ((FileAppender)a).getFileName(); if (a instanceof RollingFileAppender) return ((RollingFileAppender)a).getFileName(); if (a instanceof RoutingAppender) { try { RoutingAppender routing = (RoutingAppender)a; Field appsFiled = routing.getClass().getDeclaredField("appenders"); appsFiled.setAccessible(true); Map<String, AppenderControl> appenders = (Map<String, AppenderControl>)appsFiled.get(routing); for (AppenderControl control : appenders.values()) { Appender innerApp = control.getAppender(); if (innerApp instanceof FileAppender) return normalize(((FileAppender)innerApp).getFileName()); if (innerApp instanceof RollingFileAppender) return normalize(((RollingFileAppender)innerApp).getFileName()); } } catch (IllegalAccessException | NoSuchFieldException e) { error("Failed to get file name (was the implementation of log4j2 changed?).", e); } } } } return null; }
@Test public void testAsMap() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); final AppenderControl[] controls = new AppenderControl[] {createControl("A"), createControl("B"), createControl("C"), createControl("D")}; for (final AppenderControl ctl : controls) { set.add(ctl); } final Map<String, Appender> expected = new HashMap<>(); for (final AppenderControl ctl : controls) { expected.put(ctl.getAppenderName(), ctl.getAppender()); } assertEquals(expected, set.asMap()); }
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; }
/** * Returns all Appenders as a Map. * * @return a Map with the Appender name as the key and the Appender as the value. */ public Map<String, Appender> asMap() { final Map<String, Appender> result = new HashMap<>(); for (final AppenderControl appenderControl : appenderArray.get()) { result.put(appenderControl.getAppenderName(), appenderControl.getAppender()); } return result; }
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; }
/** * Deletes the specified appender. * * @param key The appender's key */ public void deleteAppender(final String key) { LOGGER.debug("Deleting route with " + key + " key "); final AppenderControl control = appenders.remove(key); if (null != control) { LOGGER.debug("Stopping route with " + key + " key"); control.getAppender().stop(); } else { LOGGER.debug("Route with " + key + " key already deleted"); } }
/** * 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); } } }
/** {@inheritDoc} */ @Nullable @Override public String fileName() { for (Logger log = impl; log != null; log = log.getParent()) { for (Appender a : log.getAppenders().values()) { if (a instanceof FileAppender) return ((FileAppender)a).getFileName(); if (a instanceof RollingFileAppender) return ((RollingFileAppender)a).getFileName(); if (a instanceof RoutingAppender) { try { RoutingAppender routing = (RoutingAppender)a; Field appsFiled = routing.getClass().getDeclaredField("appenders"); appsFiled.setAccessible(true); Map<String, AppenderControl> appenders = (Map<String, AppenderControl>)appsFiled.get(routing); for (AppenderControl control : appenders.values()) { Appender innerApp = control.getAppender(); if (innerApp instanceof FileAppender) return normalize(((FileAppender)innerApp).getFileName()); if (innerApp instanceof RollingFileAppender) return normalize(((RollingFileAppender)innerApp).getFileName()); } } catch (IllegalAccessException | NoSuchFieldException e) { error("Failed to get file name (was the implementation of log4j2 changed?).", e); } } } } return null; }
@Override public boolean stop(final long timeout, final TimeUnit timeUnit) { setStopping(); super.stop(timeout, timeUnit, false); final Map<String, Appender> map = configuration.getAppenders(); for (final Map.Entry<String, AppenderControl> entry : appenders.entrySet()) { final Appender appender = entry.getValue().getAppender(); if (!map.containsKey(appender.getName())) { if (appender instanceof LifeCycle2) { ((LifeCycle2) appender).stop(timeout, timeUnit); } else { appender.stop(); } } } setStopped(); return true; }