Log4j+Flume+HDFS采集日志

环境

首先我们搭建好了hadoop环境,flume等软件。
我们首先配置flume中的flume.conf

#Name the components on this agent
tier1.sources=source1  
tier1.channels=channel1  
tier1.sinks=sink1  


tier1.sources.source1.type=avro  
tier1.sources.source1.bind=0.0.0.0
#监听的端口号  
tier1.sources.source1.port=44444  
tier1.sources.source1.channels=channel1  

tier1.sources.source1.interceptors=i1
tier1.sources.source1.interceptors.i1.type=timestamp
tier1.sources.source1.interceptors.i1.preserveExisting=true


tier1.channels.channel1.type=memory  


tier1.sinks.sink1.type=hdfs  
tier1.sinks.sink1.channel=channel1  
tier1.sinks.sink1.hdfs.path=hdfs://master:8020/flume/%Y-%m-%d
tier1.sinks.sink1.hdfs.fileType=DataStream  
tier1.sinks.sink1.hdfs.writeFormat=Text
#间隔多长时间将临时文件滚动成最终目标文件,默认值是30,如果设置0则不根据时间滚动文件    
tier1.sinks.sink1.hdfs.rollInterval=0
#当临时文件达到该文件大小滚动文件  
tier1.sinks.sink1.hdfs.rollSize=102400
#当events数据达到该数量时,将临时文件滚动成目标文件,0表示不根据events数据来滚动    
tier1.sinks.sink1.hdfs.rollCount=0
#当目前被打开的临时文件在该参数指定的时间(秒)内,没有数据写入,则将临时文件关闭并重名为目标文件    
tier1.sinks.sink1.hdfs.idleTimeout=60

再来写java工程,我这里使用的maven构建项目。
1.配置pom.xml
在MyEclipse创建Maven项目中的pom.xml中加入如下内容,配置所需要的依赖。

<dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.10</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flume</groupId>
            <artifactId>flume-ng-core</artifactId>
            <version>1.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flume.flume-ng-clients</groupId>
            <artifactId>flume-ng-log4jappender</artifactId>
            <version>1.5.0</version>
        </dependency>
    </dependencies>

2.配置log4j.properties

##Log4j有三个主要组件:Loggers(记录器),Appenders(输出源)和Layouts(布局)
###这里可以简单理解为日志的类别,日志要输出的地方,日志以何种形式输出


##config rootLogger配置根记录器
###格式:log4j.rootLogger = [level],appenderName1,appenderName2

###实例log4j的根记录器,定义记录器必须得大于等于INFO的级别才能输出,输出源为stdout和flume。
####其中级别有DEBUG、INFO、WARN、ERROR和FATAL,其中这个五个的级别顺序是,DEBUG<INFO<WARN<ERROR<FATAL。
log4j.rootLogger = INFO,stdout,flume


##配置stdout输出源(控制台输出)
###配置输出源的类名
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
###指定日志信息的level为INFO
log4j.appender.stdout.Threshold=INFO
###指定输出的格式的类
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
###指定输出的格式
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n


##配置flume输出源(输出到flume中)
log4j.appender.flume=org.apache.flume.clients.log4jappender.Log4jAppender
###配置flume所在的主机号
log4j.appender.flume.Hostname=master
###配置flume监听的端口
log4j.appender.flume.Port=44444
log4j.appender.flume.UnsafeMode = true
log4j.appender.flume.Threshold=INFO
log4j.appender.flume.layout=org.apache.log4j.PatternLayout
log4j.appender.flume.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %c{1} [%p] %m%n

3.编写测试类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.log.flume.writeLog;

public class writeLog {
    protected static final Logger logger = LoggerFactory
            .getLogger(writeLog.class);

    public static void echo() {
        System.out.println(new Date() + "============");
    }

    public static void main(String[] args) {
        while (true) {
            logger.info(String.valueOf(new Date().getTime()));
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在启动flume后,运行程序便可以将信息通过log4j传入flume中,flume再存放到你之前在flume.conf中配置的hdfs的相应的路径下。我们便可以在hdfs路径下查看打印的内容。
在实际应用时我们可以在做相应的操作时,加上log4j的打印,便可以实现采集用户操作的日志信息。方便后面对这些日志进行分析工作。

猜你喜欢

转载自blog.csdn.net/jdfk423/article/details/79728293