如何在eclipse中为hadoop2.6 eclipse 2.4设置log4j

云计算实战 (海量日志管理)hadoop + scribe
-- log4j 客户端写入scribe - Open source of memory - ITeye技术网站
博客分类:
上一篇文章已经安装完scribe,下面我们用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
(如果没有错误在本文夹夹下会生成libthrift.jar)
C. 生成libfb303.jar
cd /usr/local/scribeInstall/thrift-0.2.0/contrib/fb303/java
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.
import org.apache.log4j.AsyncA
* log4j 的scribe appender
* 用ScribeAppender 类连接scribe服务器,并把日志写如scribe
* @author ninja
public class AsyncScribeAppender extends AsyncAppender {
private String scribeH
private int scribeP
private String scribeC
public String getHostname() {
public void setHostname(String hostname) {
this.hostname =
public String getScribeHost() {
return scribeH
public void setScribeHost(String scribeHost) {
this.scribeHost = scribeH
public int getScribePort() {
return scribeP
public void setScribePort(int scribePort) {
this.scribePort = scribeP
public String getScribeCategory() {
return scribeC
public void setScribeCategory(String scribeCategory) {
this.scribeCategory = scribeC
public String getEncoading() {
public void setEncoading(String encoading) {
this.encoading =
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);
public boolean requiresLayout() {
ScribeAppender .java
package com.
import net.scribe.LogE
import net.scribe.
import org.apache.log4j.WriterA
import org.apache.log4j.spi.LoggingE
import org.apache.thrift.protocol.TBinaryP
import org.apache.thrift.transport.TFramedT
import org.apache.thrift.transport.TS
import org.apache.thrift.transport.TTransportE
import java.util.L
import java.util.ArrayL
import java.net.S
import java.net.UnknownHostE
import java.net.InetA
import java.io.IOE
* 继承WriterAppender
* 实现了scribe 服务器的链接和日志的发送。
* @author ninja
public class ScribeAppender extends WriterAppender {
private String scribeH
private int scribeP
private String scribeC
private List&LogEntry& logE
private scribe.C
private TFramedT
public String getHostname() {
public void setHostname(String hostname) {
this.hostname =
public String getScribeHost() {
return scribeH
public void setScribeHost(String scribeHost) {
this.scribeHost = scribeH
public int getScribePort() {
return scribeP
public void setScribePort(int scribePort) {
this.scribePort = scribeP
public String getScribeCategory() {
return scribeC
public void setScribeCategory(String scribeCategory) {
this.scribeCategory = scribeC
public String getEncoding() {
public void setEncoding(String encoding) {
this.encoding =
* Activates this Appender by opening a transport to the Scribe server.
public void activateOptions() {
synchronized (this) {
if (hostname == null) {
hostname = InetAddress.getLocalHost()
.getCanonicalHostName();
} catch (UnknownHostException e) {
// can't get hostname
System.out.println(scribeHost + scribePort + scribeCategory + encoding);
// Thrift boilerplate code
logEntries = 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
public void append(LoggingEvent event) {
synchronized (this) {
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();
public void close() {
if (transport != null) {
transport.close();
public boolean requiresLayout() {
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
.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.
import mons.logging.L
import mons.logging.LogF
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 致命错误!!");
所有资源均在resources.rar 中。
下载次数: 518
论坛回复 /
(9 / 10880)
是啊,这个scribe收集日志存放在哪里,在/tmp/scribetext 里没有啊这目录在scribe里配
请教lz,这样做到底有哪些好处呢?
scribe 是分布式日志系统 能更好的处理海量日志. facebook 就是用的scribe.
houzhaowei
浏览: 194373 次
来自: 北京
zealot 写道顶,推荐maven开发过程系列大家不要点这S ...
您好 有个问题想请教您一下
您这个是通过jdbc连接的,如何 ...
请问一下您这里是如何通过程序生成word2007文件,还是获取 ...
这个相当于应该写到本地磁盘的日志写到了远程服务器,性能很差把, ...
楼主啊:说明:前一个webogic是指用户,后一个weblog ...1.6.2 调试Hadoop源代码
本文所属图书&>&
全书共四部分13章:第一部分(第1~2章)主要介绍了如何获取、阅读和调试Hadoop的源代码,以及YARN的设计思想、基本架构和工作流程;第二部分(第3~7章)结合源代码详细剖析和讲解了YARN的第三方开源库、底层通信&&
本节介绍两种调试Hadoop源代码的方法:利用Eclipse远程调试工具和打印调试日志。这两种方法均可以调试伪分布式工作模式和完全分布式工作模式下的Hadoop。本节主要介绍伪分布式工作模式下的Hadoop调试方法。
(1)利用Eclipse进行远程调试
下面以调试ResourceManager为例,介绍利用Eclipse远程调试的基本方法,这可分两步进行。
步骤1 调试模式下启动Hadoop。
在Hadoop安装目录下运行如下的Shell脚本:
export YARN_NODEMANAGER_OPTS=&-Xdebug -Xrunjdwp:transport=dt_socket,address=8788, server=y,suspend=y&
sbin/start-all.sh
运行了脚本后会看到Shell命令行终端显示如下信息:
Listening for transport dt_socket at address: 8788
此时表明ResourceManager处于监听状态,直到收到debug确认信息。
步骤2 设置断点。
在前面新建的Java工程&hadoop-2.0&中,找到ResourceManager相关代码,并在感兴趣的地方设置一些断点。
步骤3 在Eclipse中调试Hadoop程序。
在Eclipse的菜单栏中,依次选择 &Run&&&Debug Configurations&&&Remote Java Applications&,并按照要求填写远程调试器名称(自己定义一个即可),ResourceManager所在host以及监听端口号等信息,并选择Hadoop源代码工程,便可进入调试模式。
调试过程中,ResourceManager输出的信息被存储到日志文件夹下的yarn-XXX-resourcemanager-localhost.log文件(XXX为当前用户名)中,可通过以下命令查看调试过程中打印的日志:
tail -f logs/yarn-XXX-resourcemanager-localhost.log
(2)打印Hadoop调试日志
Hadoop使用了Apache log4j作为基本日志库,该日志库将日志分别5个级别,分别为DEBUG、INFO、WARN、ERROR和FATAL。这5个级别是有顺序的,即DEBUG & INFO & WARN & ERROR & FATAL,分别用来指定日志信息的重要程度。日志输出规则为:只输出级别不低于设定级别的日志信息,比如若级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,但级别比INFO低的DEBUG则不会输出。
在Hadoop源代码中,大部分Java文件中存在调试日志(DEBUG级别日志),但默认情况下,日志级别是INFO,为了查看更详细的运行状态,可采用以下几种方法打开DEBUG日志。
方法1 使用Hadoop Shell命令。
可使用Hadoop脚本中的daemonlog命令查看和修改某个类的日志级别,比如,可通过以下命令查看NodeManager类的日志级别:
bin/hadoop daemonlog -getlevel ${nodemanager-host}:8042 \
org.apache.hadoop.yarn.server.nodemanager.NodeManager
可通过以下命令将NodeManager类的日志级别修改为DEBUG:
bin/hadoop daemonlog -setlevel ${nodemanager-host}:8042 \
org.apache.hadoop.yarn.server.nodemanager.NodeManager DEBUG
其中,nodemanager-host为NodeManager服务所在的host,8042是NodeManager的HTTP端口号。
方法2 通过Web界面。
用户可以通过Web界面查看和修改某个类的日志级别,比如,可通过以下URL修改NodeManager类的日志级别:
http://${nodemanager-host}:8042/logLevel
方法3 修改log4j.properties文件。
以上两种方式只能暂时修改日志级别,当Hadoop重启后会被重置,如果要永久性改变日志级别,可在目标节点配置目录下的log4j.properties文件中添加以下配置选项:
log4j.logger.org.apache.hadoop.yarn.server.nodemanager.NodeManager=DEBUG
此外,有时为了专门调试某个Java文件,需要把该文件的相关日志输出到一个单独文件中,可在log4j.properties中添加以下内容:
#定义输出方式为自定义的TTOUT
log4j.logger. org.apache.hadoop.yarn.server.nodemanager.NodeManager=DEBUG,TTOUT
#设置TTOUT的输出方式为输出到文件
log4j.appender.TTOUT =org.apache.log4j.FileAppender
#设置文件路径
log4j.appender.TTOUT.File=${hadoop.log.dir}/NodeManager.log
#设置文件的布局
log4j.appender.TTOUT.layout=org.apache.log4j.PatternLayout
#设置文件的格式
log4j.appender.TTOUT.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
这些配置选项会把NodeManager.java中的DEBUG日志写到日志目录下的NodeManager.log文件中。
在源代码的过程中,为了跟踪某个变量值的变化,读者可能需要自己添加一些DEBUG日志。在Hadoop源代码中,大部分类会定义一个日志打印对象,通过该对象可打印各个级别的日志。比如,在NodeManager中用以下代码定义对象LOG:
public static final Log LOG = LogFactory.getLog(NodeManager.class);
用户可使用LOG对象打印调试日志。比如,可在NodeManager的main函数首行添加以下代码:
LOG.debug(&Start to lauch NodeManager...&);
然后重新编译Hadoop源代码,并将org.apache.hadoop.yarn.server.nodemanager.NodeManager的调试级别修改为DEBUG,重新启动Hadoop后便可以看到该调试信息。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。简化 Hadoop 2.4.1 Eclpse 插件编译 - 往事如风 - 推酷
简化 Hadoop 2.4.1 Eclpse 插件编译 - 往事如风
&?xml version=&1.0&?&
&project name=&eclipse-plugin& default=&jar&&
&property name=&jdk.home& value=&G:/jdk/jdk1.6.0& /&
&property name=&hadoop.version& value=&2.4.1& /&
&property name=&hadoop.home& value=&G:/hadoop/hadoop-2.4.1& /&
&property name=&eclipse.version& value=&4.4& /&
&property name=&eclipse.home& value=&G:/eclipse4.4& /&
&property name=&root& value=&${basedir}& /&
&property file=&${root}/build.properties& /&
&property name=&name& value=&${ant.project.name}& /&
&property name=&src.dir& location=&${root}/src/java& /&
&property name=&build.contrib.dir& location=&${root}/build/contrib& /&
&property name=&build.dir& location=&${build.contrib.dir}/${name}& /&
&property name=&build.classes& location=&${build.dir}/classes& /&
&!-- all jars together --&
&property name=&javac.deprecation& value=&off& /&
&property name=&javac.debug& value=&on& /&
&property name=&build.encoding& value=&ISO-8859-1& /&
&path id=&eclipse-sdk-jars&&
&fileset dir=&${eclipse.home}/plugins/&&
&include name=&org.eclipse.ui*.jar& /&
&include name=&org.eclipse.jdt*.jar& /&
&include name=&org.eclipse.core*.jar& /&
&include name=&org.eclipse.equinox*.jar& /&
&include name=&org.eclipse.debug*.jar& /&
&include name=&org.eclipse.osgi*.jar& /&
&include name=&org.eclipse.swt*.jar& /&
&include name=&org.eclipse.jface*.jar& /&
&include name=&org.eclipse.team.cvs.ssh2*.jar& /&
&include name=&com.jcraft.jsch*.jar& /&
&/fileset&
&path id=&project-jars&&
&fileset file=&${build.dir}/lib/*.jar& /&
&target name=&init& unless=&skip.contrib&&
&echo message=&contrib: ${name}& /&
&mkdir dir=&${build.dir}& /&
&mkdir dir=&${build.classes}& /&
&mkdir dir=&${build.dir}/lib& /&
&copy todir=&${build.dir}/lib/& verbose=&true&&
&fileset dir=&${hadoop.home}/share/hadoop/mapreduce&&
&include name=&hadoop*.jar& /&
&exclude name=&*test*&/&
&exclude name=&*example*&/&
&/fileset&
&fileset dir=&${hadoop.home}/share/hadoop/common&&
&include name=&hadoop*.jar& /&
&exclude name=&*test*&/&
&exclude name=&*example*&/&
&/fileset&
&fileset dir=&${hadoop.home}/share/hadoop/hdfs&&
&include name=&hadoop*.jar& /&
&/fileset&
&fileset dir=&${hadoop.home}/share/hadoop/yarn&&
&include name=&hadoop*.jar& /&
&exclude name=&*test*&/&
&exclude name=&*example*&/&
&/fileset&
&fileset dir=&${hadoop.home}/share/hadoop/common/lib&&
&include name=&protobuf-java-*.jar& /&
&include name=&log4j-*.jar& /&
&include name=&commons-cli-*.jar& /&
&include name=&commons-collections-*.jar& /&
&include name=&commons-configuration-*.jar& /&
&include name=&commons-lang-*.jar& /&
&include name=&jackson-core-asl-*.jar& /&
&include name=&jackson-mapper-asl-*.jar& /&
&include name=&slf4j-log4j12-*.jar& /&
&include name=&slf4j-api-*.jar& /&
&include name=&guava-*.jar& /&
&include name=&hadoop-annotations-*.jar& /&
&include name=&hadoop-auth-*.jar& /&
&include name=&commons-cli-*.jar& /&
&include name=&netty-*.jar& /&
&/fileset&
&target name=&compile& depends=&init& unless=&skip.contrib&&
&echo message=&contrib: ${name}& /&
&javac fork=&true&
executable=&${jdk.home}/bin/javac& encoding=&${build.encoding}& srcdir=&${src.dir}& includes=&**/*.java& destdir=&${build.classes}& debug=&${javac.debug}& deprecation=&${javac.deprecation}& includeantruntime=&on&&
&classpath refid=&eclipse-sdk-jars& /&
&classpath refid=&project-jars& /&
&target name=&jar& depends=&compile& unless=&skip.contrib&&
&pathconvert property=&mf.classpath& pathsep=&,lib/&&
&path refid=&project-jars& /&
&flattenmapper /&
&/pathconvert&
&jar jarfile=&${build.dir}/hadoop-${hadoop.version}-eclipse-${eclipse.version}-plugin.jar& manifest=&${root}/META-INF/MANIFEST.MF&&
&manifest&
&attribute name=&Bundle-ClassPath& value=&classes/,lib/${mf.classpath}& /&
&/manifest&
&fileset dir=&${build.dir}& includes=&classes/ lib/& /&
&fileset dir=&${root}& includes=&resources/ plugin.xml& /&
&target name=&clean&&
&echo message=&contrib: ${name}& /&
&delete dir=&${build.dir}& /&
&/project&
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见

我要回帖

更多关于 hadoop log4j 的文章

 

随机推荐