filebeat收集Nginx访问日志到kafka,logstash消费到elasticsearch,kibana展示报表

8 篇文章 0 订阅


需求背景:有一个对用户行为的分析需求,类似于用户在浏览某网页的时候,上报用户的行为信息。请求某个域名,参数信息带在url上面。类似于: 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

在 Nginx 的配置中,该域名的代理配置中,server 中加上日志的配置规则及路径

log_format content '$args';	#配置日志的规则 $args 会取 url ? 后面的内容,定义 log 的格式名为 content
access_log /tol/app/nginx/logs/content.log content; # 指定访问日志 access_log 使用 content 日志格式落到指定的路径 

filebeat

  1. 官网下载 filebeat ,上传到 Nginx 所在的服务器,解压安装
  2. 修改 filebeat.yml 文件
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]}'

kafka

创建对应的 topic

logstash

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是否有urldecode的插件
在logstash的安装目录的bin下执行下面命令:

./logstash-plugin list

可以看到有logstash-filter-urldecode插件

如果没有的话 可以执行如下命令进行安装:

./bin/logstash-plugin install logstash-filter-urldecode

然后配置conf文件,对某个字段进行解码

 urldecode {
	 field => "content"
}

logstash 写入输出kafka范例

## 写入到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     ##输出到屏幕上
    }
}

vim快捷键

功能描述快捷键
删除在视图模式下删除当前光标处的文本x
行删除在视图模式下删除当前光标处的整行dd
撤销撤销上一次的操作u
重做-Ctrl + r
复制复制光标处所在的行yy
粘贴-p

参考文章

logstash截取指定字符和grok的使用
logstash中文参考手册
Logstash:Data转换,分析,提取,丰富及核心操作
filebeat收集和转发日志配置参考
Filebeat 模块与配置
filebeat.yml(中文配置详解)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值