package com.neverwinterdp.sparkngin.log4j; import java.io.IOException; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; import com.neverwinterdp.buffer.chronicle.MultiSegmentQueue; import com.neverwinterdp.buffer.chronicle.Segment; import com.neverwinterdp.message.Message; import com.neverwinterdp.sparkngin.http.JSONHttpSparknginClient; public class SparknginLog4jAppender extends AppenderSkeleton { private String queueBufferDir; private int queueMaxSizePerSegment = 100000; private String sparknginHost ; private int sparknginPort ; private long sparknginReconnectPeriod = 10000; private String messageTopic ; private boolean queueError = false ; private MultiSegmentQueue<Log4jRecord> queue ; private DeamonThread forwardThread ; public void close() { if(forwardThread != null) { forwardThread.exit = true ; forwardThread.interrupt() ; } } public void activateOptions() { System.out.println("SparknginLog4jAppender: Start Activate Elasticsearch log4j appender"); try { queue = new MultiSegmentQueue<Log4jRecord>(queueBufferDir, queueMaxSizePerSegment) ; } catch (Exception e) { queueError = true ; e.printStackTrace(); } forwardThread = new DeamonThread(); forwardThread.setDaemon(true); forwardThread.start() ; System.out.println("SparknginLog4jAppender: Finish Activate Elasticsearch log4j appender"); } public void setQueueBufferDir(String queueBufferDir) { this.queueBufferDir = queueBufferDir; } public void setQueueMaxSizePerSegment(int queueMaxSizePerSegment) { this.queueMaxSizePerSegment = queueMaxSizePerSegment; } public void setSparknginHost(String sparknginHost) { this.sparknginHost = sparknginHost; } public void setSparknginPort(int sparknginPort) { this.sparknginPort = sparknginPort; } public void setSparknginReconnectPeriod(long sparknginReconnectPeriod) { this.sparknginReconnectPeriod = sparknginReconnectPeriod; } public void setMessageTopic(String messageTopic) { this.messageTopic = messageTopic; } public boolean requiresLayout() { return false; } protected void append(LoggingEvent event) { if(queueError) return ; Log4jRecord record = new Log4jRecord(event) ; try { queue.writeObject(record) ; } catch (Exception e) { queueError = true ; e.printStackTrace(); } } public class DeamonThread extends Thread { private JSONHttpSparknginClient client = null ; private boolean exit = false; boolean init() { try { client = new JSONHttpSparknginClient(sparknginHost, sparknginPort, 300, false) ; return client.connect(60 * 60 * 1000, sparknginReconnectPeriod) ; } catch(Exception ex) { return false ; } } public void forward() { while(true) { try { if(!client.isConnected()) { if(!client.connect(60 * 60 * 1000, sparknginReconnectPeriod)) continue ; } Segment<Log4jRecord> segment = null ; while((segment = queue.nextReadSegment(15000)) != null) { segment.open(); while(segment.hasNext()) { Log4jRecord record = segment.nextObject() ; Message message = new Message(record.getId(), record, false) ; message.getHeader().setTopic(messageTopic); client.sendPost(message, 30000); } queue.commitReadSegment(segment); } } catch (InterruptedException e) { return ; } catch(Exception ex) { client.close(); client.setNotConnected(); } } } void shutdown() { client.close() ; if(exit) { try { if(queue != null) queue.close(); } catch (IOException e) { e.printStackTrace(); } } } public void run() { if(!init()) return ; forward() ; shutdown() ; } } }