我们很多机器是集群部署,如果单独去每台机器上面去找日志会很麻烦。另外很多生产上机器会对部分人员进行限制,但却需要他们去定位生产上的问题。这里通过继承AbstractAppender实现log4j的自定义标签来发送到同一服务器集中处理。
1、首先定义一个类继承AbstractAppender
/**
* name 为log.xml里面配置标签
* @author yin
* @Method
*/
@Plugin(name = "LOG_SEND", category = "Core", elementType = "appender", printObject = true)
public class LogAppender extends AbstractAppender {
protected LogAppender(String name, Filter filter, Layout<? extends Serializable> layout) {
super(name, filter, layout);
}
/**
* 加载类之前会调用的方法
*/
@Override
public void start() {
//QueueUtil.execSys();
super.start();
}
/**
* 类结束之前调用方法
*/
@Override
public void stop() {
super.stop();
}
/**
* 日志输入的具体操作方式
* @param logEvent
*/
@Override
public void append(LogEvent logEvent) {
try {
ThrowableProxy thrownProxy = logEvent.getThrownProxy();
LogData logData;
if (Objects.isNull(thrownProxy)) {
logData= new LogData(logEvent.getMessage().getFormattedMessage(), logEvent.getThreadName(),
logEvent.getLevel().name(), logEvent.getTimeMillis(), logEvent.getLoggerName(),MachineIp.getIp());
}else {
StringBuilder sb = new StringBuilder(logEvent.getMessage().getFormattedMessage());
sb.append("\n");
dealErrorContent(thrownProxy, sb);
for (ThrowableProxy throwableProxy = thrownProxy.getCauseProxy(); !Objects.isNull(throwableProxy); throwableProxy = thrownProxy.getCauseProxy()) {
sb.append("Caused by: ");
dealErrorContent(thrownProxy, sb);
}
logData= new LogData(sb.toString(), logEvent.getThreadName(),
logEvent.getLevel().name(), logEvent.getTimeMillis(), logEvent.getLoggerName(),MachineIp.getIp());
}
//System.out.println("========================================logData====" + logData);
QueueUtil.getInstance().offer(logData);
} catch (Exception e) {
System.out.println("log4j httpAppender error !" + e);
}
}
/**
* 通过配置工厂来创建创建 LogAppender
* @param filter
* @param layout
* @param name
* @return
*/
@PluginFactory
public static LogAppender createLogAppender(@PluginElement("Filter") Filter filter, @PluginElement("layout") Layout<? extends Serializable> layout, @PluginAttribute("name") String name) {
if (name == null) {
LOGGER.error("No name provided for LogAppender");
return null;
}
if (layout == null) {
layout = PatternLayout.createDefaultLayout();
}
return new LogAppender(name, filter, layout);
}
private StringBuilder dealErrorContent(ThrowableProxy throwableProxy,StringBuilder sb ){
sb.append(throwableProxy.getName());
sb.app