OpenResty + Lua + Kafka 实现日志收集系统

1、Kafka 安装

官网下载 kafka_2.11-1.1.1.tgz,解压后,修改kafka的配置文件:config/server.properties

broker.id=0  # 在集群内必须唯一

advertised.host.name=192.168.10.100  # 配置对外IP地址,否则链接不上kafka

log.dirs=/data/kafka-logs  # 配置kafka的存储目录,包含kafka的日志和写入kafka的文件

zookeeper.connect=zk.test.com:2181  # 配置zookeeper的地址

2、启动kafka服务

nohup sh bin/kafka-server-start.sh config/server.properties > /data/kafka-logs/server.log 2>&1 &

启动kafka服务,并将服务端日志写入 server.log 文件

3、创建topic

bin/kafka-topics.sh --zookeeper zk.test.com:2181 --create --topic test1 --partitions 1 --replication-factor 1

创建名称为 test1 的topic

4、kafka测试

bin/kafka-console-producer.sh --broker-list zk.test.com:9092 --topic test1

创建一个消息生产者,输入消息则会发送到kafka

bin/kafka-console-consumer.sh --zookeeper zk.test.com:2181 --topic test1 --from-beginning

创建一个消费者,从topic头部开始消费信息

5、配置 lua-resty-kafka 

lua-resty-kafka 下载地址:https://github.com/doujiang24/lua-resty-kafka

由于需用到lua解析json,则还需要下载lua-cjson:https://github.com/openresty/lua-cjson/

将相应的配置导入到OpenResty的lua配置中

6、配置 OpenResty

server {
        listen    8088;
        location / {
            default_type text/html;
            content_by_lua '
                -- 引入lua所有api  
                local cjson = require "cjson"  
                local producer = require "resty.kafka.producer"  
                -- 定义kafka broker地址  
                local broker_list = {  
                    { host = "192.168.10.100", port = 9092 },  
                }  
                -- 定义json便于日志数据整理收集  
                local log_json = {}  
                log_json["uri"]=ngx.var.uri  
                log_json["args"]=ngx.var.args  
                log_json["host"]=ngx.var.host  
                log_json["request_body"]=ngx.var.request_body  
                log_json["remote_addr"] = ngx.var.remote_addr  
                log_json["remote_user"] = ngx.var.remote_user  
                log_json["time_local"] = ngx.var.time_local  
                log_json["status"] = ngx.var.status  
                log_json["body_bytes_sent"] = ngx.var.body_bytes_sent  
                log_json["http_referer"] = ngx.var.http_referer  
                log_json["http_user_agent"] = ngx.var.http_user_agent  
                log_json["http_x_forwarded_for"] = ngx.var.http_x_forwarded_for  
                log_json["upstream_response_time"] = ngx.var.upstream_response_time  
                log_json["request_time"] = ngx.var.request_time  
                -- 转换json为字符串  
                local message = cjson.encode(log_json);  
                -- 定义kafka异步生产者  
                local bp = producer:new(broker_list, { producer_type = "async" })  
                -- 发送日志消息,send第二个参数key,用于kafka路由控制:  
                -- key为nill(空)时,一段时间向同一partition写入数据  
                -- 指定key,按照key的hash写入到对应的partition  
                local ok, err = bp:send("test1", nil, message)  
   
                ngx.say("<br>", message)
                ngx.say("<br>kafka result:", ok)
                ngx.say("<br>kafka error:", err)
            ';
        }
    }

7、测试

访问 localhost:8088,则会将访问的日志写入kafka

3abe9a01efc985d082bb939a94b507b6c7e.jpg

1737e8b2a1f778b4ca5ad2aa8ec43ee064f.jpg

8、kafka的一些命令

基础的命令都在kafka/bin 的目录下

kafka-server-start.sh 服务启动命令

kafka-topics.sh topic的命令,可以查看topic的情况,包括名称、分区等信息

kafka-console-producer.sh 生产者命令

kafka-console-consumer.sh 消费者名称

 

 

转载于:https://my.oschina.net/u/2347047/blog/1919519

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值