1、Log4j2自定义Appender
import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.AbstractAppender; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttribute; import org.apache.logging.log4j.core.config.plugins.PluginElement; import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.core.layout.PatternLayout; import java.io.Serializable; /** * 自定义实现log4j2的输出源 */ @Plugin(name = "Gwarn", category = "Core", elementType = "appender", printObject = true) public final class GwarnLog4j2Appender extends AbstractAppender { /** * */ private static final long serialVersionUID = -3650550892005283720L; private static final byte[] lock = new byte[1]; protected GwarnLog4j2Appender(String name, Filter filter, Layout<? extends Serializable> layout, final boolean ignoreExceptions) { super(name, filter, layout, ignoreExceptions); } @Override public void append(LogEvent event) { if (event != null && event.getMessage() != null) { // 此处自定义实现输出 } } @PluginFactory public static GwarnLog4j2Appender createAppender(@PluginAttribute("name") String name, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filter") final Filter filter, @PluginAttribute("sysCode") String sysCode, @PluginAttribute("period") String period) { if (name == null) { LOGGER.error("No name provided for MyCustomAppenderImpl"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } return new GwarnLog4j2Appender(name, filter, layout, true); } }
2、Log4j自定义Appender
import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; /** * 自定义实现log4j的输出源<br/> * * 调用Log4j输出日志时,调用各个组件的顺序: <br/> * 1、日志信息传入 Logger。<br/> * 2、将日志信息封装成 LoggingEvent 对象并传入 Appender。 <br/> * 3、在 Appender 中调用 Filter 对日志信息进行过滤,调用 Layout 对日志信息进行格式化,然后输出 */ public class GwarnLog4jAppender extends AppenderSkeleton { private static final byte[] lock = new byte[1]; @Override public void close() { } // 是否需要按格式输出文本 @Override public boolean requiresLayout() { return false; } @Override protected void append(LoggingEvent event) { if (event != null && event.getMessage() != null) { // 自定义实现 } } }
3、Logback自定义Appender
import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; /** * 自定义实现logback的输出源 */ public class GwarnLogbackAppender extends AppenderBase<ILoggingEvent> { private static final byte[] lock = new byte[1]; @Override protected void append(ILoggingEvent eventObject) if (eventObject != null && eventObject.getMessage() != null) { // 自定义实现 } } }
logback:
<!--异常收集 -->
<appender name="gwarn"class="com.duowan.gwarn.sdk.GwarnLogbackAppender">
<filterclass="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root>
<levelvalue="INFO" />
<appender-refref="gwarn" />
</root>
log4j:
log4j.rootLogger=INFO,gwarn
log4j.appender.gwarn=com.duowan.gwarn.sdk.GwarnLog4jAppender
log4j.appender.gwarn.Threshold = ERROR
log4j2:
<configurationpackages="com.duowan.gwarn.sdk">
<appenders>
<Gwarnname="gwarn">
<ThresholdFilterlevel="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Gwarn>
</appenders>
<loggers>
<rootlevel="info">
<appender-refref="gwarn" />
</root>
</loggers>
</configuration>