private AppenderControl createControl(final String name) { final Appender appender = FailOnceAppender.createAppender(name); return new AppenderControl(appender, Level.INFO, null); }
/** {@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 void append(LogEvent event) { setupAppenderIfRequired(event); if (appenderControl.get() != null) { if (!(event.getMarker() != null && event.getMarker().getName() != null && event.getMarker().getName().equals(Log4jQueryCompleteMarker.EOF_MARKER))) { appenderControl.get().callAppender(event); } else { LOGGER.debug("Not forwarding message with maker={}, marker.getName={}", event.getMarker(), (event.getMarker() == null ? "nullMarker" : event.getMarker().getName())); } } }
@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()); }
@Test public void testRemoveRemovesItemFromSet() throws Exception { final AppenderControlArraySet set = new AppenderControlArraySet(); set.add(createControl("A")); set.add(createControl("B")); set.add(createControl("C")); set.add(createControl("D")); assertEquals(4, set.get().length); set.remove("B"); assertEquals(3, set.get().length); final AppenderControl[] three = set.get(); assertEquals("A", three[0].getAppenderName()); assertEquals("C", three[1].getAppenderName()); assertEquals("D", three[2].getAppenderName()); set.remove("C"); assertEquals(2, set.get().length); final AppenderControl[] two = set.get(); assertEquals("A", two[0].getAppenderName()); assertEquals("D", two[1].getAppenderName()); set.remove("A"); assertEquals(1, set.get().length); final AppenderControl[] one = set.get(); assertEquals("D", one[0].getAppenderName()); set.remove("D"); assertTrue(set.isEmpty()); }
/** * Call the appender. * * @param event The event to process. */ public void callAppender(final LogEvent event) { if (shouldSkip(event)) { return; } callAppenderPreventRecursion(event); }
@PerformanceSensitive private boolean isRecursiveCall() { if (recursive.get() != null) { appenderErrorHandlerMessage("Recursive call to appender "); return true; } return false; }
private void callAppenderPreventRecursion(final LogEvent event) { try { recursive.set(this); callAppender0(event); } finally { recursive.set(null); } }
/** * 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; }
/** * Removes the AppenderControl with the specific name and returns it (or {@code null} if no such appender existed). * * @param name The name of the AppenderControl to remove * @return the removed AppenderControl or {@code null} */ public AppenderControl remove(final String name) { boolean success; do { success = true; final AppenderControl[] original = appenderArray.get(); for (int i = 0; i < original.length; i++) { final AppenderControl appenderControl = original[i]; if (Objects.equals(name, appenderControl.getAppenderName())) { final AppenderControl[] copy = removeElementAt(i, original); if (appenderArray.compareAndSet(original, copy)) { return appenderControl; // successfully removed } success = false; // could not swap: array was modified by another thread break; } } } while (!success); return null; // not found }
private void handleError(final String prefix) { final String msg = appenderErrorHandlerMessage(prefix); if (!appender.ignoreExceptions()) { throw new AppenderLoggingException(msg); } }
appenderControl.set(new AppenderControl(app, null, null)); if (LOGGER.isDebugEnabled()) { RandomAccessFileAppender raf = (RandomAccessFileAppender) app;
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; }
private void logToErrorAppenderIfNecessary(final boolean appendSuccessful, final LogEvent logEvent) { if (!appendSuccessful && errorAppender != null) { errorAppender.callAppender(logEvent); } }
/** * Adds an Appender to the LoggerConfig. * * @param appender The Appender to add. * @param level The Level to use. * @param filter A Filter for the Appender reference. */ public void addAppender(final Appender appender, final Level level, final Filter filter) { appenders.add(new AppenderControl(appender, level, filter)); }
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; }
/** * Calls {@link AppenderControl#callAppender(LogEvent) callAppender} on all registered {@code AppenderControl} * objects, and returns {@code true} if at least one appender call was successful, {@code false} otherwise. Any * exceptions are silently ignored. * * @param event the event to forward to the registered appenders * @return {@code true} if at least one appender call succeeded, {@code false} otherwise */ boolean callAppenders(final LogEvent event) { boolean success = false; for (final AppenderControl control : appenders) { try { control.callAppender(event); success = true; } catch (final Exception ex) { // If no appender is successful the error appender will get it. } } return success; }
@Override public void start() { final Map<String, Appender> map = config.getAppenders(); int errors = 0; final Appender appender = map.get(primaryRef); if (appender != null) { primary = new AppenderControl(appender, null, null); } else { LOGGER.error("Unable to locate primary Appender " + primaryRef); ++errors; } for (final String name : failovers) { final Appender foAppender = map.get(name); if (foAppender != null) { failoverAppenders.add(new AppenderControl(foAppender, null, null)); } else { LOGGER.error("Failover appender " + name + " is not configured"); } } if (failoverAppenders.isEmpty()) { LOGGER.error("No failover appenders are available"); ++errors; } if (errors == 0) { super.start(); } }
/** * 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"); } }
private void callAppender(final LogEvent event) { try { primary.callAppender(event); nextCheckNanos = 0; } catch (final Exception ex) { nextCheckNanos = System.nanoTime() + intervalNanos; failover(event, ex); } }