Hi, all,
I want to add a log plugin which produce log through kafka

The general information is as follows:
1. Collect log information
2. Get kafka config 
3. Send kafka msg


A brief code presentation:

```
local producer = require "resty.kafka.producer"

 function _M.log(conf, ctx)
    local consume = ctx.var.upstream_response_time or 0
    local par = ngx.encode_args(req.params())
    if string.len(par) > 1000 then
        par = string.sub(par,1,1000) .. '...'
    end

    local log_json = {}
    log_json["entry"] = ctx.entry
    log_json["uid"] = ctx.request_uid or 2
    log_json["username"] = ctx.request_username or "odin_api"
    log_json["user_ip"] = ctx.var.remote_addr
    log_json["url"] = ctx.var.scheme .. '://' .. ctx.var.host .. ':' .. 
ctx.var.server_port .. ctx.var.uri
    log_json["route"] = ctx.var.uri
    log_json["host"] = ctx.var.upstream_host
    log_json["method"] = ngx.req.get_method()
    log_json["params"] = par
    log_json["consume"] = ctx.var.request_time * 1000
    log_json["upstream_consume"] = consume * 1000
    log_json["status"] = ngx.status
    log_json["logtime"] = time.now()
    --- you can log more info 


    --- get kafka confg
    local local_conf, err = fetch_local_conf()
    if not local_conf then
        return nil, nil, err
    end

    local opts = clone_tab(local_conf.kafka)
    local kafka_topic = opts.topic
    local broker_host = opts.broker_list_host
    local broker_port = opts.broker_list_port

    local topic = kafka_topic
    local broker_list = {
        { host = broker_host, port = broker_port },
    }

    -- kafka producer
    local p = producer:new(broker_list, { producer_type = "async" })

    --- send msg 
    local offset, err = p:send(topic, nil, message)
    if not offset then
        return
    end

```
        




Reply via email to