本帖最后由 howtodown 于 2014-5-7 23:32 编辑
问题导读:
1.scribe是什么?
2.scribe安装需要哪些软件?
3.如何生成scribe客户端?
4.log4j三个Java文件的作用是什么?
scribe 介绍:
scribe 是facebook 开源的分布式日志系统 。 可以用java 借助log4j 向分布式scribe 写入日志。
安装环境 : centos5.2
所需软件 :
安装过程:
一、输入gcc –v 检查gcc版本是否>3.3.5
是,则继续下一步。否,则安装gcc 。
二、安装ruby 和python
python 用默认安装路径。Ruby 推荐使用默认路径
安装过程均为./configure make make install
三、安装lievent
解压安装即可
安装过程为./configure make make install
四、安装 boost
解压安装即可(不可改路径)
五、安装 php 和libxml2
先安装libxml2 (php依赖它) 在安装php(默认安装路径)
安装过程均为./configure make make install
六、安装facebook 服务-- thrift 和 fb303
首先解压并进入thrift 目录
./bootstrap.sh
./configure –with-boost=/usr/local/include/boost/ -- with-php-config=/phppath /bin/php-config
make
make install
thrift 安装完毕。
在当前目录 cd 到contrib/fb303/ :
./bootstrap.sh
./configure –with-boost=/usr/local/include/boost/
make
make install
fb303安装完毕。
七、安装scribe
./bootstrap
./configure –with-boost=/usr/local/include/boost/
make
make install
安装完毕。
配置环境变量 :
BOOST_ROOT=/usr/local/include/boost/
LD_LIBRARY_PATH=/usr/local/include/boost/lib::/usr/lob:/usr/local/lib
测试:
/usr/local/bin/scribed [scribe 解压目录]/examples/example1.conf
回车会出现:
[Sun Oct 31 23:37:38 2010] "STATUS: STARTING"
[Sun Oct 31 23:37:38 2010] "STATUS: configuring"
[Sun Oct 31 23:37:38 2010] "got configuration data from file </home/setups/scribe/scribe/examples/example1.conf>"
[Sun Oct 31 23:37:38 2010] "CATEGORY : default"
[Sun Oct 31 23:37:38 2010] "Creating default store"
[Sun Oct 31 23:37:38 2010] "configured <1> stores"
[Sun Oct 31 23:37:38 2010] "STATUS: "
[Sun Oct 31 23:37:38 2010] "STATUS: ALIVE"
[Sun Oct 31 23:37:38 2010] "Starting scribe server on port 1463"
Thrift: Sun Oct 31 23:37:38 2010 libevent 2.0.7-rc method epoll 复制代码
okay scribe 服务已启动。 (这个不只是测试,也是启动scribe 服务的方式。) 补充: 关于scribe 的安装 在下载目录下有个有个readme 写的很详细(可能没我写的实用^^) scribe的启动和集群测试,均在examples 目录下的redme 上 写得相当详细。
上面已经安装完scribe,下面我们用java端,通过log4j 把日志写入scribe 日志系统。
一、生成scribe客户端
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。
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:
package com.logtest;
import org.apache.log4j.AsyncAppender;
/**
* log4j 的scribe appender
* 用ScribeAppender 类连接scribe服务器,并把日志写如scribe
* @author ninja
*/
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;
}
@Override
public 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);
}
}
@Override
public boolean requiresLayout() {
return true;
}
} 复制代码
ScribeAppender .java
复制代码
log4j.properties
#1 \u5b9a\u4e49\u4e86\u4e24\u4e2a\u8f93\u51fa\u7aef
log4j.rootLogger = DEBUG,CONSOLE,scribe
log4j.addivity.org.apache=true
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %-4r [%t] %-5p %c - %m%n
log4j.logger.com.vmars= DEBUG, scribe
log4j.appender.scribe= com.logtest.AsyncScribeAppender
log4j.appender.scribe.encoading=utf-8
log4j.appender.scribe.hostname=scribe
log4j.appender.scribe.scribeHost=192.168.2.221
log4j.appender.scribe.scribePort=1463
log4j.appender.scribe.hostname=ninja
log4j.appender.scribe.scribeCategory=scribe
log4j.appender.scribe.layout=org.apache.log4j.PatternLayout
log4j.appender.scribe.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
复制代码
测试客户端:
package com.logtest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class LogTest {
private static Log log = LogFactory.getLog(LogTest.class);
public static void main(String[] args) {
log.error("this is a charactor test ");
log.debug("这是中文测试");
log.fatal("fatal error 致命错误!!");
}
}
复制代码