scribe 简单使用java

来源:互联网 发布:北京精雕编程软件下载 编辑:程序博客网 时间:2024/06/06 05:30

1. 安装见 http://blog.csdn.net/east271536394/article/details/7849574

2.scribe 整体架构

  

                

              scribe是一个服务,负责监听服务器的某个端口1464/1463

              使用方式,通过javaphp程序调用thrift的函数,向该 ip:port发送msgscribe将接收到msg,按照msgcategory分类储存。

 3.java 程序使用

     1. 生成需要的jar 文件

     2.修改log4j配置文件

     

#1 \u5b9a\u4e49\u4e86\u4e24\u4e2a\u8f93\u51fa\u7aeflog4j.rootLogger = DEBUG,CONSOLE,scribelog4j.addivity.org.apache=truelog4j.appender.CONSOLE = org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern = %-4r [%t] %-5p %c - %m%nlog4j.logger.com.vmars= DEBUG, scribelog4j.appender.scribe= cn.east.study.scribe.demo.AsyncScribeAppenderlog4j.appender.scribe.encoading=utf-8log4j.appender.scribe.hostname=scribelog4j.appender.scribe.scribeHost=202.173.9.19log4j.appender.scribe.scribePort=1463log4j.appender.scribe.hostname=eastlog4j.appender.scribe.scribeCategory=scribelog4j.appender.scribe.layout=org.apache.log4j.PatternLayoutlog4j.appender.scribe.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

        3. 编写日志plugin

       

import org.apache.log4j.AsyncAppender;/** * log4j 的scribe appender * 用ScribeAppender 类连接scribe服务器,并把日志写如scribe * @author east271536394 */public class AsyncScribeAppender extends AsyncAppender {private String hostname;private String scribeHost;private int scribePort;private String scribeCategory;private String encoading;public String getHostname() {return hostname;}public void setHostname(String hostname) {this.hostname = hostname;}public String getScribeHost() {return scribeHost;}public void setScribeHost(String scribeHost) {this.scribeHost = scribeHost;}public int getScribePort() {return scribePort;}public void setScribePort(int scribePort) {this.scribePort = scribePort;}public String getScribeCategory() {return scribeCategory;}public void setScribeCategory(String scribeCategory) {this.scribeCategory = scribeCategory;}public String getEncoading() {return encoading;}public void setEncoading(String encoading) {this.encoading = encoading;}@Overridepublic void activateOptions() {super.activateOptions();synchronized (this) {ScribeAppender scribeAppender = new ScribeAppender();scribeAppender.setLayout(getLayout());scribeAppender.setHostname(getHostname());scribeAppender.setScribeHost(getScribeHost());scribeAppender.setScribePort(getScribePort());scribeAppender.setScribeCategory(getScribeCategory());scribeAppender.setEncoding(getEncoading());scribeAppender.activateOptions();addAppender(scribeAppender);}}@Overridepublic boolean requiresLayout() {return true;}}

import java.io.IOException;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import java.util.ArrayList;import java.util.List;import org.apache.log4j.WriterAppender;import org.apache.log4j.spi.LoggingEvent;import org.apache.thrift.protocol.TBinaryProtocol;import org.apache.thrift.transport.TFramedTransport;import org.apache.thrift.transport.TSocket;import org.apache.thrift.transport.TTransportException;import cn.east.study.scribe.api.LogEntry;import cn.east.study.scribe.api.scribe;/** * 继承WriterAppender  * 实现了scribe 服务器的链接和日志的发送。 * @author east271536394 */public class ScribeAppender extends WriterAppender {private String hostname;private String scribeHost;private int scribePort;private String scribeCategory;private String encoding;private List<LogEntry> logEntries;private scribe.Client client;private TFramedTransport transport;public String getHostname() {return hostname;}public void setHostname(String hostname) {this.hostname = hostname;}public String getScribeHost() {return scribeHost;}public void setScribeHost(String scribeHost) {this.scribeHost = scribeHost;}public int getScribePort() {return scribePort;}public void setScribePort(int scribePort) {this.scribePort = scribePort;}public String getScribeCategory() {return scribeCategory;}public void setScribeCategory(String scribeCategory) {this.scribeCategory = scribeCategory;}public String getEncoding() {return encoding;}public void setEncoding(String encoding) {this.encoding = encoding;}/* * Activates this Appender by opening a transport to the Scribe server. */@Overridepublic void activateOptions() {try {synchronized (this) {if (hostname == null) {try {hostname = InetAddress.getLocalHost().getCanonicalHostName();} catch (UnknownHostException e) {// can't get hostname}}System.out.println(scribeHost + scribePort + scribeCategory + encoding);// Thrift boilerplate codelogEntries = new ArrayList<LogEntry>(1);TSocket sock = new TSocket(new Socket(scribeHost, scribePort));transport = new TFramedTransport(sock);TBinaryProtocol protocol = new TBinaryProtocol(transport, false, false);client = new scribe.Client(protocol, protocol);// This is commented out because it was throwing Exceptions for// no good reason.// transport.open();}} catch (TTransportException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/* * Appends a log message to Scribe */@Overridepublic void append(LoggingEvent event) {synchronized (this) {try {String message = String.format("%s %s", hostname, layout.format(event));LogEntry entry = new LogEntry(scribeCategory, message);logEntries.add(entry);client.Log(logEntries);} catch (Exception e) {e.printStackTrace();} finally {logEntries.clear();}}}@Overridepublic void close() {if (transport != null) {transport.close();}}@Overridepublic boolean requiresLayout() {return true;}}
编写测试类

public class LogTest {private static Log log = LogFactory.getLog(LogTest.class);public static void main(String[] args) {for (int i = 0; i < 10000; i++) {log.error("this is a charactor test ");log.debug("test debug");log.fatal("fatal error test scribe");}try {Thread.currentThread().sleep(100000);} catch (InterruptedException e) {e.printStackTrace();}}}