logstash配合redis实例

来源:互联网 发布:单片机方案 编辑:程序博客网 时间:2024/05/16 18:55

解释术语:

  • Shipper:日志收集者。负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来,输出到Redis暂存。
  • Indexer:日志存储者。负责从Redis接收日志,写入到本地文件。
  • Broker:日志Hub,用来连接多个Shipper和多个Indexer。

无论是Shipper还是Indexer,Logstash始终只做前面提到的3件事:

  • Shipper从日志文件读取最新的行文本,经过处理(这里我们会改写部分元数据),输出到Redis,
  • Indexer从Redis读取文本,经过处理(这里我们会format文本),输出到文件。

一个Logstash进程可以有多个输入源,所以一个Logstash进程可以同时读取一台服务器上的多个日志文件。Redis是Logstash官方推荐的Broker角色“人选”,支持订阅发布和队列两种数据传输模式,推荐使用。输入输出支持过滤,改写。Logstash支持多种输出源,可以配置多个输出实现数据的多份复制,也可以输出到Email,File,Tcp,或者作为其它程序的输入,又或者安装插件实现和其他系统的对接,比如搜索引擎Elasticsearch。

总结:Logstash概念简单,通过组合可以满足多种需求


1.官网https://www.elastic.co/products/logstash下载logstash包
一般也解压到/usr/local/下,形成/usr/local/logstash-2.4.0/bin这种目录结构。
2.在/usr/local/logstash-2.4.0/目录下创建conf文件夹作为配置文件的目录,在/conf目录下创建test.conf文件,配置文件的内容如下:
input {
    file {
        path => [
            # 这里填写需要监控的文件
            "/usr/local/logstash-2.4.0/data/test.log"
        ]
    }
}

output {
    # 输出到控制台
    # stdout { }

    # 输出到redis
    redis {
        host => localhost   # redis主机地址
        port => 6379              # redis端口号 
        #db => 8                   # redis数据库编号
        data_type => "channel"    # 使用发布/订阅模式
        key => "logstash_list_0"  # 发布通道名称
    }
}
3.运行logstash可以执行指定的配置文件./logstash -f ../conf/test.conf 

4.启动redis ./redis-server& --protected-mode no(非保护模式,外网可以访问)
启动的三种方式详情请参照chrome浏览器标签redis
本实例采用第二种方式,通过指定配置文件启动
/opt/app/redis-3.2.0/redis.conf配置如下:
daemonize yes#是否在后台运行,是
port 6379#启动服务的端口号为6379
logfile "/var/log/sentinel_log.log"//日志存放的位置
protected-mode no//是否以保护模式(是否可以外网访问)启动

5.启动后,运行redis客户端,可以支持多个客户端,各客户端看到的日志信息都是一样的(因为使用了订阅模式channel)
./redis-cli 
SUBSCRIBE logstash_list_0
就能实时读取日志信息


6.在java中实现:
Subscriber.java
package com.relax.www.cache.redis;

import com.alibaba.fastjson.JSON;
import com.hfjy.base.util.JSONUtil;

import redis.clients.jedis.JedisPubSub;


public class Subscriber extends JedisPubSub {
    public Subscriber() {
    }

    public void onMessage(String channel, String message) {
        System.out.println(String.format("receive redis published message, channel %s, message %s", channel, message));
        System.out.println(JSON.toJSONString(JSONUtil.toJSONObject(message), true));
    }

    public void onSubscribe(String channel, int subscribedChannels) {
        System.out.println(String.format("subscribe redis channel success, channel %s, subscribedChannels %d", 
                channel, subscribedChannels));
    }

    public void onUnsubscribe(String channel, int subscribedChannels) {
        System.out.println(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d", 
                channel, subscribedChannels));

    }
}
RedisClient.java

public class RedisClient {
    private static String IpAddress;
    private static int IpPort;
    private volatile static Jedis jedis;
    private static final Logger logger = Logger.getLogger(RedisClient.class);
    static {
        IpAddress = "192.168.60.250";
        IpPort = 6379;
        jedis = RedisClient.getJedisInstance();
    }

    // 单例模式获取redis服务

    public static Jedis getJedisInstance() {
        if (jedis == null) {
            synchronized (RedisClient.class) {
                if (jedis == null) {
                    jedis = new Jedis(IpAddress, IpPort);
                }
            }
        }

        return jedis;
    }

    public static void main(String[] args) {
        final Subscriber subscriber = new Subscriber();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    jedis.subscribe(subscriber, "logstash_list_0");
                }

            }
        }).start();
    }

}

出现如下结果:









0 0
原创粉丝点击