下面列出了怎么用org.apache.logging.log4j.core.config.AppenderControl的API类实例代码及写法,或者点击链接到github查看源代码。
private void failover(final LogEvent event, final Exception ex) {
final RuntimeException re = ex != null ?
(ex instanceof LoggingException ? (LoggingException) ex : new LoggingException(ex)) : null;
boolean written = false;
Exception failoverException = null;
for (final AppenderControl control : failoverAppenders) {
try {
control.callAppender(event);
written = true;
break;
} catch (final Exception fex) {
if (failoverException == null) {
failoverException = fex;
}
}
}
if (!written && !ignoreExceptions()) {
if (re != null) {
throw re;
}
throw new LoggingException("Unable to write to failover appenders", failoverException);
}
}
/** {@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;
}
@Setup
public void setup() {
listAppender.start();
final AppenderControl control = new AppenderControl(listAppender, Level.ALL, null);
appenderSet.add(control);
}
/**
* 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() {
for (final AppenderRef ref : appenderRefs) {
final String name = ref.getRef();
final Appender appender = config.getAppender(name);
if (appender != null) {
final Filter filter = appender instanceof AbstractAppender ?
((AbstractAppender) appender).getFilter() : null;
appenders.put(name, new AppenderControl(appender, ref.getLevel(), filter));
} else {
LOGGER.error("Appender " + ref + " cannot be located. Reference ignored");
}
}
super.start();
}
/**
* Modifies the event and pass to the subordinate Appenders.
* @param event The LogEvent.
*/
@Override
public void append(LogEvent event) {
if (rewritePolicy != null) {
event = rewritePolicy.rewrite(event);
}
for (final AppenderControl control : appenders.values()) {
control.callAppender(event);
}
}
@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();
}
}
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 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);
return (ListAppender) appenderControl.getAppender();
}
protected void callAppenders(final LogEvent event) {
for (final AppenderControl control : appenderSet) {
control.callAppender(event);
}
}
public AsyncThread(final List<AppenderControl> appenders, final BlockingQueue<LogEvent> queue) {
super("AsyncAppender-" + THREAD_SEQUENCE.getAndIncrement());
this.appenders = appenders;
this.queue = queue;
setDaemon(true);
}
/**
* Returns an unmodifiable view of the appenders created by this {@link RoutingAppender}.
* Note that this map does not contain appenders that are routed by reference.
*/
public Map<String, AppenderControl> getAppenders() {
return createdAppendersUnmodifiableView;
}