Skip to content

olivetree123/logdog

Repository files navigation

LogDog

日志采集、解析和上报的工具。
类似于 logstash,但是比 logstash 小巧。
类似于 filebeat,但是能够解析日志。

Install

wget -O - https://olivetree.oss-cn-hangzhou.aliyuncs.com/install.sh | bash

Configuration

// vim /etc/logdog/logdog.toml
[input]
    [input.accesslog]
        type = "file"
        path = "/var/log/aaa.log"
        format = "text"
        regex = "(?P<level>\\w+) (?P<time>\\S+) \\w+ (?P<content>\\w+)"


[handler]
    [handler.accesslog]
        script_path = "/var/lib/logdog/myHandler.lua"
        [handler.accesslog.add_data]
            school_id = "123"
            class_id = "123"

[output]
    [output.other]
        type = "stdout"
    [output.accesslog2]
        type = "http"
        http_url = "http://localhost:9000"
        [output.accesslog2.headers]
            Auth = "123456"
    [output.accesslog]
        type = "redis"
        redis_addr = "localhost:6379"
        redis_db = 0
        redis_key = "logdog"

Run

logdog

配置说明

配置文件采用的是 toml 格式,详情可参考TOML
配置分为 3 个部分,input/handler/output

1. input

参数说明如下:

type    // 仅支持 file
path    // 文件路径,/var/log/*.log
format  // text/json,如果设置为 json,则 logdog 会将取出的数据进行反序列化,转换成 json 对象
        // json 常用于 docker 容器日志
regex   // 正则表达式,必须包含 PatternName。format = json 时无效。

如果没有配置正则表达式,input 输出的数据是这样的:

{
    "message":"INFO 2019-09-30 HelloWorld!"
}

如果配置了正则表达式,input 输出的数据是这样的:

{
    "message":{
        "level":"INFO",
        "time":"2019-09-30",
        "content":"HelloWorld!",
    }
}

2. handler

input 取出数据做简单的处理之后,会将结果交给 handler.

add_data

在 handler 中,你可以通过 add_data 给数据添加字段。
上面的配置文件添加了school_id 和 class_id 两个字段,结果会是这样:

{
    "message":{
        "level":"INFO",
        "time":"2019-09-30",
        "content":"HelloWorld!",
    },
    "add_data":{
        "school_id":"123",
        "class_id":"123",
    }
}
lua 脚本

handler 还可以执行 lua 脚本。通过参数 script_path 指定 lua 脚本的路径。
在 lua 脚本中,必须包含 myHandler 方法,logdog 只会执行该方法。 myHandler 方法有一个参数,logdog 会将add_data处理之后的结果传递给该方法,并使用该方法的返回值替换原有的数据结果。

-- lua 脚本示例
-- myHandler 方法不可少,logdog 只会执行该方法
-- 该方法有且仅有一个参数, logdog 会将 input 和 add_data 处理之后的结果传递过来
-- 该方法有返回值,返回值为二进制格式
function myHandler(dataBytes)
    package.path = "/Users/gao/code/gowork/src/logDog/*.so"
    local json = require("cjson")
    local data = json.decode(dataBytes)
    --local add_data = data["add_data"]
    --local message = data["message"]
    --for key, val in pairs(message) do
    --    print(key, val)
    --end
    data["service"] = "logdog"
    return json.encode(data)
end

注意 1:myHandler 方法不可少,logdog 只会执行该方法
注意 2:参数和返回值都是使用 json.encode 生成的二进制对象

3. output

output 支持 3 种:

stdout  // 标准输出
redis   // 输出到 redis 队列中(lpush)
http    // 通过 http 接口输出

TODO

input: RabbitMQ/Kafka/HTTP/UDP Socket
output: MySQL/Postgres/MongoDB/ES

Releases

No releases published

Packages

No packages published