Chinaunix首页 | 论坛 | 博客
  • 博客访问: 434511
  • 博文数量: 75
  • 博客积分: 2780
  • 博客等级: 少校
  • 技术积分: 789
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 20:38
文章分类

全部博文(75)

文章存档

2012年(1)

2011年(11)

2010年(12)

2009年(39)

2008年(12)

我的朋友

分类: LINUX

2011-03-16 17:08:01

用java端,通过log4j 把日志写入scribe 日志系统。

 

 

一、生成scribe客户端

  • 生成 java客户端api

   A. 修改配置文件scribe.thrift
      cd /usr/local/scribeInstall/scribe/if
      vi scribe.thrift
      修改scribe.thrift文件: 把 include "fb303/if/fb303.thrift" 改成
      include "[thrift解压路径]/thrift-0.5.0/contrib/fb303/if/fb303.thrift"
   B. 生成 java客户端api     
      运行命令 thrift --gen java scribe.thrift
      运行后会生成一个‘gen-java’的文件夹.里面会有3个java类,封装了所有java客户端发送log所需要的api。

 

 

  • 生成客户端代码所需要的jar包
   A. 如果之前没设置ANT_HOME 和 PATH 请先设置这两个环境变量
      export ANT_HOME=/usr/local/apache-ant-1.8.0
      export PATH=$PATH:$ANT_HOME/bin
   B. 生成libthrift.jar
      cd /usr/local/scribeInstall/thrift-0.2.0/lib/java
      ant 
      (如果没有错误在本文夹夹下会生成libthrift.jar)
   C. 生成libfb303.jar

 

 cd /usr/local/scribeInstall/thrift-0.2.0/contrib/fb303/java

ant

ant 执行成功后 libfb303.jar 会出现在/usr/local/scribeInstall/contrib/fb303/java/build/lib下

 

 

二、创建项目,运行测试 

  • 创建项目
     A.在eclipse 创建普通java项目
     B.在项目中导入以下jar
     
    C.在项目中添加gen-java 文件夹里的三个java类。
  •    编写项目
    编写log4j 的scribe appender 

    AsyncScribeAppender.java:
    
Java代码  收藏代码
  1. package com.logtest;  
  2.   
  3. import org.apache.log4j.AsyncAppender;  
  4. /** 
  5.  * log4j 的scribe appender 
  6.  * 用ScribeAppender 类连接scribe服务器,并把日志写如scribe 
  7.  * @author ninja 
  8.  */  
  9. public class AsyncScribeAppender extends AsyncAppender {  
  10.   
  11.     private String hostname;  
  12.     private String scribeHost;  
  13.     private int scribePort;  
  14.     private String scribeCategory;  
  15.     private String encoading;  
  16.   
  17.     public String getHostname() {  
  18.         return hostname;  
  19.     }  
  20.   
  21.     public void setHostname(String hostname) {  
  22.         this.hostname = hostname;  
  23.     }  
  24.   
  25.     public String getScribeHost() {  
  26.         return scribeHost;  
  27.     }  
  28.   
  29.     public void setScribeHost(String scribeHost) {  
  30.         this.scribeHost = scribeHost;  
  31.     }  
  32.   
  33.     public int getScribePort() {  
  34.         return scribePort;  
  35.     }  
  36.   
  37.     public void setScribePort(int scribePort) {  
  38.         this.scribePort = scribePort;  
  39.     }  
  40.   
  41.     public String getScribeCategory() {  
  42.         return scribeCategory;  
  43.     }  
  44.   
  45.     public void setScribeCategory(String scribeCategory) {  
  46.         this.scribeCategory = scribeCategory;  
  47.     }  
  48.   
  49.     public String getEncoading() {  
  50.         return encoading;  
  51.     }  
  52.   
  53.     public void setEncoading(String encoading) {  
  54.         this.encoading = encoading;  
  55.     }  
  56.   
  57.     @Override  
  58.     public void activateOptions() {  
  59.         super.activateOptions();  
  60.         synchronized (this) {  
  61.             ScribeAppender scribeAppender = new ScribeAppender();  
  62.             scribeAppender.setLayout(getLayout());  
  63.             scribeAppender.setHostname(getHostname());  
  64.             scribeAppender.setScribeHost(getScribeHost());  
  65.             scribeAppender.setScribePort(getScribePort());  
  66.             scribeAppender.setScribeCategory(getScribeCategory());  
  67.             scribeAppender.setEncoding(getEncoading());  
  68.             scribeAppender.activateOptions();  
  69.             addAppender(scribeAppender);  
  70.         }  
  71.     }  
  72.   
  73.     @Override  
  74.     public boolean requiresLayout() {  
  75.         return true;  
  76.     }  
  77.   
  78. }  
 
 ScribeAppender .java

 

Java代码  收藏代码
  1. package com.logtest;  
  2.   
  3. import net.scribe.LogEntry;  
  4. import net.scribe.scribe;  
  5.   
  6. import org.apache.log4j.WriterAppender;  
  7. import org.apache.log4j.spi.LoggingEvent;  
  8. import org.apache.thrift.protocol.TBinaryProtocol;  
  9. import org.apache.thrift.transport.TFramedTransport;  
  10. import org.apache.thrift.transport.TSocket;  
  11. import org.apache.thrift.transport.TTransportException;  
  12.   
  13. import java.util.List;  
  14. import java.util.ArrayList;  
  15. import java.net.Socket;  
  16. import java.net.UnknownHostException;  
  17. import java.net.InetAddress;  
  18. import java.io.IOException;  
  19.   
  20. /** 
  21.  * 继承WriterAppender  
  22.  * 实现了scribe 服务器的链接和日志的发送。 
  23.  * @author ninja 
  24.  */  
  25. public class ScribeAppender extends WriterAppender {  
  26.   
  27.     private String hostname;  
  28.     private String scribeHost;  
  29.     private int scribePort;  
  30.     private String scribeCategory;  
  31.     private String encoding;  
  32.   
  33.     private List logEntries;  
  34.   
  35.     private scribe.Client client;  
  36.     private TFramedTransport transport;  
  37.   
  38.     public String getHostname() {  
  39.         return hostname;  
  40.     }  
  41.   
  42.     public void setHostname(String hostname) {  
  43.         this.hostname = hostname;  
  44.     }  
  45.   
  46.     public String getScribeHost() {  
  47.         return scribeHost;  
  48.     }  
  49.   
  50.     public void setScribeHost(String scribeHost) {  
  51.         this.scribeHost = scribeHost;  
  52.     }  
  53.   
  54.     public int getScribePort() {  
  55.         return scribePort;  
  56.     }  
  57.   
  58.     public void setScribePort(int scribePort) {  
  59.         this.scribePort = scribePort;  
  60.     }  
  61.   
  62.     public String getScribeCategory() {  
  63.         return scribeCategory;  
  64.     }  
  65.   
  66.     public void setScribeCategory(String scribeCategory) {  
  67.         this.scribeCategory = scribeCategory;  
  68.     }  
  69.       
  70.   
  71.     public String getEncoding() {  
  72.         return encoding;  
  73.     }  
  74.   
  75.     public void setEncoding(String encoding) {  
  76.         this.encoding = encoding;  
  77.     }  
  78.   
  79.     /* 
  80.      * Activates this Appender by opening a transport to the Scribe server. 
  81.      */  
  82.     @Override  
  83.     public void activateOptions() {  
  84.         try {  
  85.             synchronized (this) {  
  86.                 if (hostname == null) {  
  87.                     try {  
  88.                         hostname = InetAddress.getLocalHost()  
  89.                                 .getCanonicalHostName();  
  90.                     } catch (UnknownHostException e) {  
  91.                         // can't get hostname  
  92.                     }  
  93.                 }  
  94.         System.out.println(scribeHost + scribePort + scribeCategory + encoding);  
  95.                 // Thrift boilerplate code  
  96.                 logEntries = new ArrayList(1);  
  97.                 TSocket sock = new TSocket(new Socket(scribeHost, scribePort));  
  98.                 transport = new TFramedTransport(sock);  
  99.                 TBinaryProtocol protocol = new TBinaryProtocol(transport,  
  100.                         falsefalse);  
  101.                 client = new scribe.Client(protocol, protocol);  
  102.                 // This is commented out because it was throwing Exceptions for  
  103.                 // no good reason.  
  104.                 // transport.open();  
  105.             }  
  106.         } catch (TTransportException e) {  
  107.             e.printStackTrace();  
  108.         } catch (UnknownHostException e) {  
  109.             e.printStackTrace();  
  110.         } catch (IOException e) {  
  111.             e.printStackTrace();  
  112.         } catch (Exception e) {  
  113.             e.printStackTrace();  
  114.         }  
  115.     }  
  116.   
  117.     /* 
  118.      * Appends a log message to Scribe 
  119.      */  
  120.     @Override  
  121.     public void append(LoggingEvent event) {  
  122.         synchronized (this) {  
  123.             try {  
  124.                 String message = String.format("%s %s", hostname, layout  
  125.                         .format(event));  
  126.                 LogEntry entry = new LogEntry(scribeCategory, message);  
  127.                 logEntries.add(entry);  
  128.                 client.Log(logEntries);  
  129.             } catch (Exception e) {  
  130.                 e.printStackTrace();  
  131.             } finally {  
  132.                 logEntries.clear();  
  133.             }  
  134.         }  
  135.     }  
  136.   
  137.     @Override  
  138.     public void close() {  
  139.         if (transport != null) {  
  140.             transport.close();  
  141.         }  
  142.     }  
  143.   
  144.     @Override  
  145.     public boolean requiresLayout() {  
  146.         return true;  
  147.     }  
  148. }  

 

 

   log4j.properties

 

Java代码  收藏代码
  1. #1 \u5b9a\u4e49\u4e86\u4e24\u4e2a\u8f93\u51fa\u7aef  
  2. log4j.rootLogger = DEBUG,CONSOLE,scribe  
  3. log4j.addivity.org.apache=true  
  4.   
  5. log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender  
  6. log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout  
  7. log4j.appender.CONSOLE.layout.ConversionPattern = %-4r [%t] %-5p %c - %m%n  
  8.   
  9. log4j.logger.com.vmars= DEBUG, scribe  
  10. log4j.appender.scribe= com.logtest.AsyncScribeAppender  
  11. log4j.appender.scribe.encoading=utf-8  
  12. log4j.appender.scribe.hostname=scribe  
  13. log4j.appender.scribe.scribeHost=192.168.2.221  
  14. log4j.appender.scribe.scribePort=1463  
  15. log4j.appender.scribe.hostname=ninja  
  16. log4j.appender.scribe.scribeCategory=scribe  
  17. log4j.appender.scribe.layout=org.apache.log4j.PatternLayout  
  18. log4j.appender.scribe.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n  

 

 

   测试客户端:

 

Java代码  
  1. package com.logtest;  
  2.   
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5.   
  6.   
  7. public class LogTest {  
  8.       
  9.     private static Log log = LogFactory.getLog(LogTest.class);  
  10.       
  11.     public static void main(String[] args) {  
  12.         log.error("this is a charactor test ");  
  13.         log.debug("这是中文测试");  
  14.         log.fatal("fatal error 致命错误!!");  
  15.     }  
  16. }  

 

 

所有资源均在resources.rar 中。

  •  (1.1 MB)
阅读(5566) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~