package com.chickling.util; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.routing.RoutingAppender; import org.apache.logging.log4j.core.config.AppenderControl; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * Created by jw6v on 2016/2/15. */ public class StopLogger { public synchronized static void stopLogger(Logger log){ log.info("stop logger"); String key = ThreadContext.get("logFileName"); org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) log; org.apache.logging.log4j.core.LoggerContext context = (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext(); RoutingAppender appender = (RoutingAppender) context.getConfiguration().getAppender("RoutingAppender"); try { Method method = appender.getClass().getDeclaredMethod("getControl",String.class,LogEvent.class); method.setAccessible(true); AppenderControl appenderControl = (AppenderControl) method.invoke(appender,key,null); appenderControl.getAppender().stop(); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { // Shouldn't happen - log anyway log.error("Unable to close the logger",e); } } }