http://www.baidu.com?content={"a:"b"}&user=1&name=b
(内容会通过urlencoder编码)。通过Nginx的访问日志,用 filebeat 收集这个日志文件写入到 kafka 中,logstash 消费这个 kafka.topic ,通过 filter 转换成想要的格式,写入到 elasticsearch 中。
其中:Nginx 落参数日志比较简单,filebeat 写入到 kafka 也比较简单,先创建好 topic 即可。logstash 消费 kafka.topic 输出日志也很容易,稍微有些麻烦的地方在于,logstash 处理日志内容,因为filebeat和logstash消费都会加上自己的信息。这时候就需要用到 logstash 的 filter 过滤规则了。
在 Nginx 的配置中,该域名的代理配置中,server 中加上日志的配置规则及路径
log_format content '$args'; #配置日志的规则 $args 会取 url ? 后面的内容,定义 log 的格式名为 content
access_log /tol/app/nginx/logs/content.log content; # 指定访问日志 access_log 使用 content 日志格式落到指定的路径
filebeat.prospectors:
- input.type: log # 来源的类型
enabled: true # 表示这个input源启动
include_lines: ['content'] #包含 content 的行
paths: /tol/app/nginx/logs/content.log #监听文件的路径
tail_files: true # 是否 tail 的方式
fields:
topicname: test_log_caoke # 自定义的字段名,可以在配置文件的别的地方引用
# 处理,移除字段,这些字段 filebeat 会在写入 kafka 的时候默认加上 ,配置此可以移除,以 @ 开头的不可移除
processors:
- drop_fields:
fields: ["beat","input","source","offset","topicname","timestamp","@metadata"]
#输出源为kafka,下面配置 kafka 的连接地址和 topic
output.kafka:
hosts: ["10.11.12.13:10193","10.11.12.17:10193"]
topic: '%{[fields.topicname]}'
创建对应的 topic
logstash处理消息格式,不做处理原始消息格式为:
{
"message" => "{\"@timestamp\":\"2019-09-24T09:27:39.262Z\",\"@metadata\":{\"beat\":\"filebeat\",\"type\":\"doc\",\"version\":\"6.2.2\",\"topic\":\"test_log_caoke\"},
\"message\":\"content=%7B%22data%22%3A%7B%22type%22%3A%22Performance-afterOL%22%2C%22fmp%22%3A117%2C2%3A1569317256615%2C%22appid%22%3A%22%22%7D\\u0026appid=\\u0026sign=d274c97aa9d3d93bd0d7dc374f09a22b\\u0026clits=1569317256615\",
\"fields\":{\"topicname\":\"test_log_caoke\"}}",
"@timestamp" => 2019-09-24T09:27:40.372Z,
"@version" => "1"
}
每经过一个中间件,就会加上一些字段,所以需要在filter中,配置各种规则,去过滤掉不想要的字段。
# 输入数据源,配置上 kakfa 连接设置
input {
kafka {
bootstrap_servers => ["10.11.12.13:10193","10.11.12.17:10193"]
client_id => "test"
# auto_offset_reset => "latest"
topics => ["test_log_caoke"]
consumer_threads => 5
group_id => 'logstash'
}
}
# 过滤规则,通过 filebeat ,写入 kafka ,在通过logstash消费时,冗余的字段
filter {
# 1.把当前消息中的 message 字段提取出来,作为一个新的消息体
json {
source => "message"
}
# 2.把1中生成的新消息体,去掉下面的字段
mutate {
remove_field => ["@version","@timestamp","fields"]
}
# 3.此时就剩下message 一个字段,对此字段进行拆分,以 & 分开,然后以 = ,组成 kv 格式
kv {
source => "message"
field_split => "&?"
}
# 4. 移除掉原始的 message 字段
mutate {
remove_field => ["message"]
}
# 5.判断 content 字段是否存在,不存在删除
if ![content] {
drop {}
}
# 6.对content 进行url解码
urldecode {
field => "content"
}
# 7. 对content进行json格式化,并且赋值给content
json {
source => "content"
target => "content"
}
}
# 写入到elasticsearch中
output {
elasticsearch {
hosts => ["elasticsearch.com:80"] # 不加端口号,会默认给一个
index => "test_log_caoke_200190924" # 索引名称,不加 document_type 会默认创建一个叫 doc 的type
}
stdout {
codec => rubydebug
}
}
先查看下logstash是否有urldecode的插件
在logstash的安装目录的bin下执行下面命令:
./logstash-plugin list
可以看到有logstash-filter-urldecode插件
如果没有的话 可以执行如下命令进行安装:
./bin/logstash-plugin install logstash-filter-urldecode
然后配置conf文件,对某个字段进行解码
urldecode {
field => "content"
}
## 写入到kafka
input {
stdin { }
}
output {
kafka {
bootstrap_servers => "10.0.0.200:9092"
topic_id => "test"
}
}
## 从kafka中将数据读出,写入到 elasticsearch 中
input {
kafka {
bootstrap_servers => ["10.0.0.200:9092"] ##kafka地址,可以是集群
client_id => "test"
auto_offset_reset => "latest" ##从最新的偏移量开始消费
topics => ["test"] ## 数组类型,可配置多个topic
decorate_events => true #此属性会将当前topic、offset、group、partition等信息也带到message中
consumer_threads => 5
}
}
output {
elasticsearch {
hosts => ["10.0.0.140:9200"]
index => "kafka-%{+YYYY.MM.dd}"
}
stdout{
codec => rubydebug ##输出到屏幕上
}
}
功能 | 描述 | 快捷键 |
---|---|---|
删除 | 在视图模式下删除当前光标处的文本 | x |
行删除 | 在视图模式下删除当前光标处的整行 | dd |
撤销 | 撤销上一次的操作 | u |
重做 | - | Ctrl + r |
复制 | 复制光标处所在的行 | yy |
粘贴 | - | p |
logstash截取指定字符和grok的使用
logstash中文参考手册
Logstash:Data转换,分析,提取,丰富及核心操作
filebeat收集和转发日志配置参考
Filebeat 模块与配置
filebeat.yml(中文配置详解)