这一节介绍的收集方法是通过log4j appender 实现的日志收集器。
public class LogClientAppender extends AppenderSkeleton { @Override protected void append(LoggingEvent loggingEvent) { LogLevel logLevel = LogLevel.Info; if(Level.DEBUG.equals(loggingEvent.getLevel())){ logLevel = LogLevel.Debug; }else if(Level.WARN.equals(loggingEvent.getLevel())){ logLevel = LogLevel.Warn; }else if(Level.ERROR.equals(loggingEvent.getLevel())){ logLevel = LogLevel.Error; } StackTraceElement[] stacks = Thread.currentThread().getStackTrace(); String className = ""; String methodName = ""; if(stacks != null && stacks.length > 0){ className = stacks[stacks.length-1].getClassName(); methodName = stacks[stacks.length-1].getMethodName(); } LogInfoDto logInfoDto = new LogInfoDto(); Map<String,String> dataMap = LogInterceptor.threadLocal.get(); if(dataMap != null){ logInfoDto.setParentId(dataMap.get("parentId")); logInfoDto.setParentClass(dataMap.get("parentClass")); logInfoDto.setParentMethod(dataMap.get("parentMethod")); } logInfoDto.setProject(LogClientConfig.getValue(LogCfgEnum.Project)); …… LogSenderFactory.getLogSender().send(logInfoDto); }
public void close() { } public boolean requiresLayout() { return false; } }
稍微介绍一下log4j的三大组件:
1、Logger:负责供客户端代码调用,执行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
2、Appender:负责日志的输出,Log4j已经实现了多种不同目标的输出方式,可以向文件输出日志、向控制台输出日志、向Socket输出日志等。
3、Layout:负责日志信息的格式化。
老司机说,要想实现自定义log4j Appender
只要继承log4j公共的基类:AppenderSkeleton
打印日志核心方法:abstract protected void append(LoggingEvent event);
初始化加载资源:public void activateOptions(),默认实现为空
释放资源:public void close()
是否需要按格式输出文本:public boolean requiresLayout()
正常情况下我们只需要覆盖append方法即可。