概述


Windows平台:Java写日志到Flume,Flume最终把日志写到MongoDB。

系统环境


  • 操作系统:win7 64
  • JDK:1.6.0_43

资源下载

辅助资源下载

  • MongoDB Java Driver:2.13.0
    下载地址:mongo-java-driver-2.13.0.jar
    下载之后放入Flume安装目录的lib下。
  • flume-ng-mongodb-sink
    Flume需要这个,才能把数据写到MongoDB中
    下载地址:flume-ng-mongodb-sink
    这是一个基于Maven的源代码,package之后,将jar包放到Flume安装目录的lib下。

初始化


数据初始化

为MongoDB指定dbpath。
  1. 新建一个目录,作为dbpath
    e.g. D:\develop\MongoDB\mydata
  2. 启动监听服务 - CMD运行
    D:\develop\MongoDB\bin\mongod --dbpath=D:\develop\MongoDB\mydata

配置Flume

  1. 生成flume-env.ps1
    在安装目录的conf/下,复制flume-env.ps1.template,重命名为flume-env.ps1
  2. 修改log4j.properties
    在安装目录的conf/下,修改文件log4j.properties;修改flume.root.logger=INFO,console

实现


Flume到MongoDB

在Flume安装目录的conf下,添加mongo-agent.properties:
agent.sources = so1
agent.channels = c1
agent.sinks = s1 agent.sources.so1.type = avro
agent.sources.so1.bind = 0.0.0.0
agent.sources.so1.port = 44444
agent.sources.so1.channels = c1 agent.channels.c1.type = memory
agent.channels.c1.capacity = 1000
agent.channels.c1.transactionCapacity = 100 agent.sinks.s1.type = org.riderzen.flume.sink.MongoSink
agent.sinks.s1.host = localhost
agent.sinks.s1.port = 27017
agent.sinks.s1.model = single
agent.sinks.s1.db = test
agent.sinks.s1.collection = log
agent.sinks.s1.batch = 100
agent.sinks.s1.channel = c1

简单说明:

  1. 根据agent.sources.so1的相关配置,在44444端口开启监听 - log4j可以往这个端口写日志
  2. 根据agent.sinks.s1的相关配置,so1接收到的数据,将写到localhost:27017的test数据库的log-collection中
    27017是MongoDB的默认监听端口

Java到Flume

这是一个基于Maven的一个simple project,你可以从flume-ng-java2mongodb拿到源代码。

文件结构

src/main/java
|---- cn.sinobest.flume.client.demo
|---- LogDemo.java
src/main/resources
|---- log4j.properties
pom.xml

文件内容

  1. pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.sinobest.asj</groupId>
    <artifactId>fluent-client-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
    </dependency>
    <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
    </dependency>
    <dependency>
    <groupId>org.apache.flume.flume-ng-clients</groupId>
    <artifactId>flume-ng-log4jappender</artifactId>
    <version>1.6.0</version>
    </dependency>
    </dependencies>
    </project>
  2. log4j.properties
    # 配置Log4jAppender,能写日志到Flume
    log4j.appender.flumeAvro=org.apache.flume.clients.log4jappender.Log4jAppender
    log4j.appender.flumeAvro.Hostname=localhost
    log4j.appender.flumeAvro.Port=44444
    log4j.appender.flumeAvro.UnsafeMode=true
    log4j.appender.flumeAvro.layout=org.apache.log4j.PatternLayout
    log4j.appender.flumeAvro.layout.ConversionPattern=%m
    # 配置根logger 此配置的日志级别和appender会被所有的logger继承
    log4j.rootLogger=INFO, flumeAvro

    注意:

    <1> org.apache.flume.clients.log4jappender.Log4jAppender负责将数据写到Flume的具体实现
    <2> 44444端口为前文Flume配置agent.sources.so1的监听端口
  3. LogDemo.java
    package cn.sinobest.flume.client.demo;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    public class LogDemo {
    static final Log log = LogFactory.getLog(LogDemo.class); public static void main(String[] args) {
    log.info("{'name':'Adam', 'age':'26', 'skill':'reading'}");
    }
    }
    注意:确保日志内容是json格式的字符串。

测试

  1. 启动MongoDB

    D:\develop\MongoDB\bin\mongod --dbpath=D:\develop\MongoDB\mydata
  2. 启动Flume
    # cd F:\temp\apache-flume-1.6.0-bin\bin
    flume-ng.cmd agent --conf ..\conf -f ..\conf\mongo-agent.properties -n agent

    说明:第1行命令是提醒确认当前所在路径。

  3. 运行LogDemo
  4. 查看结果
    D:\tools\PowerCmd>D:\develop\MongoDB\bin\mongo
    2016-03-08T18:05:33.168+0800 I CONTROL [main] Hotfix KB2731284 or later update is not installed, will zero-out data files
    MongoDB shell version: 3.2.3
    connecting to: test
    > db.log.find()
    { "_id" : ObjectId("56dea2b18449e36553652bc3"), "name" : "Adam", "age" : "26", "skill" : "reading" }
    >
    说明:
    <1> mongo默认连接test数据库,也可以使用mongo test的方式指定连接test数据库。
    <2> db.log.find()用来查看log-collection中的数据,可以看到数据已经写入成功。

附录


参考资料

  1. Flume使用小结
    主要参考了环境搭建部分,其他部分不适合。
  2. flume学习01-flume介绍
    博主写了一系列,共3篇文章来介绍Flume,这里只贴出第一篇,算是入门文章。后面有些内容没有研究。
  3. Flume 1.5日志采集并存入mongodb的安装搭建
    主要参考了Flume配置文件中,MongoSink的配置 - 后来发现博主没有指定db,数据是写到events数据库的events-collection中

Flume学习应用:Java写日志数据到MongoDB的更多相关文章

  1. 应用Flume+HBase采集和存储日志数据

    1. 在本方案中,我们要将数据存储到HBase中,所以使用flume中提供的hbase sink,同时,为了清洗转换日志数据,我们实现自己的AsyncHbaseEventSerializer. pac ...

  2. 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考

    本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...

  3. flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去

    1. openrestry的安装 OpenResty = Nginx + Lua,是⼀一个增强的Nginx,可以编写lua脚本实现⾮非常灵活的逻辑 (1)安装开发库依赖 yum install -y ...

  4. Jmeter 在 beanshell 脚本中写日志

    JMETER 在执行时,会写日志数据,我们在编写脚本的时候也可以自己写日志. 日志记录再jmeter 的bin 目录的 jmeter.log 文件中. jmeter 比较人性化,它在这里提供了脚本可以 ...

  5. flume学习(三):flume将log4j日志数据写入到hdfs(转)

    原文链接:flume学习(三):flume将log4j日志数据写入到hdfs 在第一篇文章中我们是将log4j的日志输出到了agent的日志文件当中.配置文件如下: tier1.sources=sou ...

  6. 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】

    一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...

  7. 学习笔记:分布式日志收集框架Flume

    业务现状分析 WebServer/ApplicationServer分散在各个机器上,想在大数据平台hadoop上进行统计分析,就需要先把日志收集到hadoop平台上. 思考:如何解决我们的数据从其他 ...

  8. 海量日志数据提取某日访问百度次数最多的那个IP的Java实现

    海量日志数据提取某日访问百度次数最多的那个IP的Java实现 前几天在网上看到july的一篇文章<教你如何迅速秒杀掉:99%的海量数据处理面试题>,里面说到百度的一个面试题目,题目如下: ...

  9. 零基础学习java------29---------网络日志数据session案例,runtime(导出jar程序)

    一. 网络日志数据session案例 部分数据 数据中的字段分别为: 访客ip地址,访客访问时间,访客请求的url及协议,网站响应码,网站返回数据量,访客的referral url,访客的客户端操作系 ...

随机推荐

  1. Maven -- 在进行war打包时用正式环境的配置覆盖开发环境的配置

    我们的配置文件一般都放在  src/main/resource 目录下. 假定我们的正式环境配置放在 src/main/online-resource 目录下. 那么打成war包时,我们希望用onli ...

  2. java与C#的基础语法区别--持续更新

    1.判断字符串是否相等 java : equals()比较的是对象的内容(区分字母的大小写格式),但是如果使用“==”比较两个对象时,比较的是两个对象的内存地址,所以不相等.即使它们内容相等,但是不同 ...

  3. 【NOIP】提高组2005 过河

    [算法]状态压缩型DP [题解] Q=tx+(t-1)y 对于Q≥t(t-1),x,y一定有解. 所以当两石子间距离long>t(t-1)时,令long=t(t-1),重新构造数组即可. [注意 ...

  4. Spring MVC 与 CORS

    1. CORS 简介 同源策略(same origin policy)是浏览器安全的基石.在同源策略的限制下,非同源的网站之间不能发送 ajax 请求的. 为了解决这个问题,w3c 提出了跨源资源共享 ...

  5. httpd -v command not found

    使用 find / -name "apachectl"查找文件目录下执行 ./apachectl -v

  6. bzoj 1305 二分+最大流判定|贪心

    首先我们二分一个答案mid,在判定是否能举办mid次,那么对于每个次我们可以用最大流根据是否满流(流量为n*mid)来判定,对于每个点我们拆成两个点,分别表示这个人要和他喜欢和不喜欢的人一起跳舞,那么 ...

  7. canvas_简单练习

    效果图 实现原理: 1.定义canvas标签. 2.获取canvas标签节点,创建canvas2D. 3.在canvas进行画图. 效果代码: <!DOCTYPE html> <ht ...

  8. typeof的用法

    typeof可以返回变量的类型,返回值为字符串,其值有 "undefined" "boolean" "string" "numbe ...

  9. mysql中的enum型

    enum设置后 值只能是给出的值中的其中一个 mysql> create table enum(e enum('1','2','3','4','5','6','7','8','9','10')) ...

  10. ADO POST时出现“无法为更新定位行,一些值可能已在最后一次读取后已更改”问题的解决方法

    原因有这样几种: 1.在数据库设计时,为某些字段设置了默认值,在修改进行提交以后,数据库会自动修改对应字段的所有行的默认值,从而导致了数据库与数据集中数据的不一致,使ADOQuery无法对数据集进行定 ...