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
参数说明如下:
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