@Override public void activateAsync(List<Object[]> args) { Map<String, Appender> appenders = logger.getAppenders(); if (appenders == null) { throw new IllegalStateException("Activate async appender failed, no appender exist."); } AppenderRef[] refs = new AppenderRef[appenders.size()]; int i = 0; for (Appender appender : appenders.values()) { configuration.addAppender(appender); refs[i++] = AppenderRef.createAppenderRef(appender.getName(), null, null); } AsyncAppender.Builder builder = AsyncAppender.newBuilder() .setName(productName + "." + logger.getName() + ".AsyncAppender") .setConfiguration(configuration) .setAppenderRefs(refs) .setBlockingQueueFactory(ArrayBlockingQueueFactory.<LogEvent>createFactory()); invokeMethod(builder, args); AsyncAppender asyncAppender = builder.build(); asyncAppender.start(); removeAllAppenders(logger); logger.addAppender(asyncAppender); setProductName(productName); }
final Logger logger = LogManager.getLogger(AsyncAppenderQueueFullPolicyTest.class); assertEquals(4, asyncAppender.getQueueCapacity()); logger.error("event 1 - gets taken off the queue"); logger.warn("event 2"); logger.info("event 3"); logger.info("event 4"); while (asyncAppender.getQueueRemainingCapacity() == 0) { assertEquals("queue remaining capacity", 0, asyncAppender.getQueueRemainingCapacity()); assertEquals("EventRouter invocations", 0, policy.queueFull.get());
/** * Actual writing occurs here. * * @param logEvent The LogEvent. */ @Override public void append(final LogEvent logEvent) { if (!isStarted()) { throw new IllegalStateException("AsyncAppender " + getName() + " is not active"); } final Log4jLogEvent memento = Log4jLogEvent.createMemento(logEvent, includeLocation); InternalAsyncUtil.makeMessageImmutable(logEvent.getMessage()); if (!transfer(memento)) { if (blocking) { // delegate to the event router (which may discard, enqueue and block, or log in current thread) final EventRoute route = asyncQueueFullPolicy.getRoute(thread.getId(), memento.getLevel()); route.logMessage(this, memento); } else { error("Appender " + getName() + " is unable to write primary appenders. queue is full"); logToErrorAppenderIfNecessary(false, memento); } } }
static long asyncRemainingCapacity(Logger logger) { if (logger instanceof AsyncLogger) { try { Field f = field(AsyncLogger.class, "loggerDisruptor"); return ((AsyncLoggerDisruptor) f.get(logger)).getDisruptor().getRingBuffer().remainingCapacity(); } catch (Exception ex) { throw new RuntimeException(ex); } } else { LoggerConfig loggerConfig = ((org.apache.logging.log4j.core.Logger) logger).get(); if (loggerConfig instanceof AsyncLoggerConfig) { try { Object delegate = field(AsyncLoggerConfig.class, "delegate").get(loggerConfig); return ((Disruptor) field(AsyncLoggerConfigDisruptor.class, "disruptor").get(delegate)).getRingBuffer().remainingCapacity(); } catch (Exception ex) { throw new RuntimeException(ex); } } else { Appender async = loggerConfig.getAppenders().get("async"); if (async instanceof AsyncAppender) { return ((AsyncAppender) async).getQueueCapacity(); } } } throw new IllegalStateException("Neither Async Loggers nor AsyncAppender are configured"); } private static Field field(Class<?> c, String name) throws NoSuchFieldException {
@Override public int getQueueRemainingCapacity() { return asyncAppender.getQueueRemainingCapacity(); } }
@Override public AsyncAppender build() { return new AsyncAppender(name, filter, appenderRefs, errorRef, bufferSize, blocking, ignoreExceptions, shutdownTimeout, configuration, includeLocation, blockingQueueFactory); } }
/** * Returns the name of the appender that any errors are logged to or {@code null}. * @return the name of the appender that any errors are logged to or {@code null} */ @Override public String getErrorRef() { return asyncAppender.getErrorRef(); }
@Override public String[] getAppenderRefs() { return asyncAppender.getAppenderRefStrings(); }
@Override public String getFilter() { return String.valueOf(asyncAppender.getFilter()); }
@Override public int getQueueCapacity() { return asyncAppender.getQueueCapacity(); }
return new AsyncAppender(name, filter, appenderRefs, errorRef, size, blocking, ignoreExceptions, shutdownTimeout, config, includeLocation, new ArrayBlockingQueueFactory<LogEvent>());
@Override public void activateAsync(List<Object[]> args) { Map<String, Appender> appenders = logger.getAppenders(); if (appenders == null) { throw new IllegalStateException("Activate async appender failed, no appender exist."); } AppenderRef[] refs = new AppenderRef[appenders.size()]; int i = 0; for (Appender appender : appenders.values()) { configuration.addAppender(appender); refs[i++] = AppenderRef.createAppenderRef(appender.getName(), null, null); } AsyncAppender.Builder builder = AsyncAppender.newBuilder() .setName(productName + "." + logger.getName() + ".AsyncAppender") .setConfiguration(configuration) .setAppenderRefs(refs) .setBlockingQueueFactory(ArrayBlockingQueueFactory.<LogEvent>createFactory()); invokeMethod(builder, args); AsyncAppender asyncAppender = builder.build(); asyncAppender.start(); removeAllAppenders(logger); logger.addAppender(asyncAppender); setProductName(productName); }
@Override public void activateAsync(List<Object[]> args) { Map<String, Appender> appenders = logger.getAppenders(); if (appenders == null) { throw new IllegalStateException("Activate async appender failed, no appender exist."); } AppenderRef[] refs = new AppenderRef[appenders.size()]; int i = 0; for (Appender appender : appenders.values()) { configuration.addAppender(appender); refs[i++] = AppenderRef.createAppenderRef(appender.getName(), null, null); } AsyncAppender.Builder builder = AsyncAppender.newBuilder() .setName(productName + "." + logger.getName() + ".AsyncAppender") .setConfiguration(configuration) .setAppenderRefs(refs) .setBlockingQueueFactory(ArrayBlockingQueueFactory.<LogEvent>createFactory()); invokeMethod(builder, args); AsyncAppender asyncAppender = builder.build(); asyncAppender.start(); removeAllAppenders(logger); logger.addAppender(asyncAppender); setProductName(productName); }
@Override public void activateAsync(List<Object[]> args) { Map<String, Appender> appenders = logger.getAppenders(); if (appenders == null) { throw new IllegalStateException("Activate async appender failed, no appender exist."); } AppenderRef[] refs = new AppenderRef[appenders.size()]; int i = 0; for (Appender appender : appenders.values()) { configuration.addAppender(appender); refs[i++] = AppenderRef.createAppenderRef(appender.getName(), null, null); } AsyncAppender.Builder builder = AsyncAppender.newBuilder() .setName(productName + "." + logger.getName() + ".AsyncAppender") .setConfiguration(configuration) .setAppenderRefs(refs) .setBlockingQueueFactory(ArrayBlockingQueueFactory.<LogEvent>createFactory()); invokeMethod(builder, args); AsyncAppender asyncAppender = builder.build(); asyncAppender.start(); removeAllAppenders(logger); logger.addAppender(asyncAppender); setProductName(productName); }