flume源码分析--Log4j日志直接发送到Flume过程分析(三)
来源:互联网 发布:淘宝gsx查询 编辑:程序博客网 时间:2024/05/21 15:47
一、分析Log4j向flume发送日志的过程
按照前述调试过程,理清Log4j向flume发送日志所经过的过程,如下所示:
首先在初始化日志类时,就需要读取配置文件信息,并对其进行解读定位,关键是用到了org.apache.flume.clients.log4jappender.Log4jAppender类。在类初始化过程中,重点对该类进行调用,使得log4j在输出时可以通过netty,输出到相应的目标当中。
private static final Logger logger = LoggerFactory.getLogger(MyTest.class);
初始化过程中其调用关系为log4j->log4jAppender->RpcClientFactory ->NettyAvroRpcClient,如下图所示
可以看出,log4j将日志直接输送到flume当中,同发送到文件、console等appender中一样,flume在其源码过程中,特意增加Log4jAppender类来解决相关的传送问题。
logger.info("Now the time is:{}",String.valueOf(new Date().getTime()));
log4j在输出的时候调用了log4jAppender通过netty将相关数据传递到flume中,有关log4j的如何调用Appender网上相关分析很多,大家可以自行搜索。
二、log4jAppender分析
有关log4j的Appender自定义开发可以参考这里,该文详细介绍了log4j的调用机理、结构关系及自定义Appender需要注意的事项,log4j能够直接输出日志到flume,核心就在于flume源码中提供了自定义的log4jAppender来解决这一问题。
1、继承log4j公共的基类:AppenderSkeleton
public class Log4jAppender extends AppenderSkeleton { private String hostname; private int port; ……
2、重写打印日志核心方法:abstract protected void append(LoggingEvent event);
@Override public synchronized void append(LoggingEvent event) throws FlumeException{ //If rpcClient is null, it means either this appender object was never //setup by setting hostname and port and then calling activateOptions //or this appender object was closed by calling close(), so we throw an //exception to show the appender is no longer accessible. if (rpcClient == null) { String errorMsg = "Cannot Append to Appender! Appender either closed or" + " not setup correctly!"; LogLog.error(errorMsg); if (unsafeMode) { return; } throw new FlumeException(errorMsg); } ……
3、初始化加载资源:public void activateOptions(),
@Override public void activateOptions() throws FlumeException { Properties props = new Properties(); props.setProperty(RpcClientConfigurationConstants.CONFIG_HOSTS, "h1"); props.setProperty(RpcClientConfigurationConstants.CONFIG_HOSTS_PREFIX + "h1", hostname + ":" + port); props.setProperty(RpcClientConfigurationConstants.CONFIG_CONNECT_TIMEOUT, ……
这里最关键的是在参数初始化过程中初始化了netty连接,这也是flume-NG一个比较大的改动,使用了JBOSS的netty来完成传输任务。
其他如释放资源:public void close();是否需要按格式输出文本:public boolean requiresLayout() 等等在类中都有体现,可以进一步进行仔细的分析。
- flume源码分析--Log4j日志直接发送到Flume过程分析(三)
- flume源码分析--Log4j日志直接发送到Flume过程分析(二)
- 【Java】【Flume】Flume-NG启动过程源码分析(三)
- 【Java】【Flume】Flume-NG启动过程源码分析(三)
- flume学习(一):log4j直接输出日志到flume
- flume学习(一):log4j直接输出日志到flume
- flume学习(一):log4j直接输出日志到flume
- flume学习(一):log4j直接输出日志到flume
- flume学习(一):log4j直接输出日志到flume
- flume学习(一):log4j直接输出日志到flume
- 【Java】【Flume】Flume-NG启动过程源码分析(一)
- 【Java】【Flume】Flume-NG启动过程源码分析(二)
- 【Java】【Flume】Flume-NG启动过程源码分析(一)
- 【Java】【Flume】Flume-NG启动过程源码分析(一)
- 【Java】【Flume】Flume-NG启动过程源码分析(二)
- 源码分析Flume启动过程
- 源码分析Flume启动过程
- flume学习(三):flume将log4j日志数据写入到hdfs
- 用自己的数据训练Faster-RCNN
- 理解 Java GC(三)
- 交换知识
- Spring之IoC----常见类型数据的注入
- shell(一)
- flume源码分析--Log4j日志直接发送到Flume过程分析(三)
- vi编辑器的使用
- Fragment全解析系列(二):正确的使用姿势
- Android studio 图片显示过大 RadioButton
- mysql源码安装
- Citrix虚拟化实施部署中的一些注意点
- Bigtable 具体是怎样一个东西?和 MapReduce, Google File System 之间的关系是什么?
- 小HY的四元组
- atan数学函数应用实例