这个东西有什么用呢
我们通过搜集日志的信息。将日志在通过Graylog进行分析,例如将日志中的IP地址进行字段提取 ,可以分析用户的访问地,做一个统计,可以灵敏感知用户群体分布地,如下图:
搜集日志的过程如下图
Graylog Sidecar是一种针对不同日志收集器的轻量级配置管理系统,Graylog 节点充当包含日志收集器配置的集中式枢纽。
在支持的消息生成设备/主机上,Sidecar 可以作为服务(Windows 主机)或守护程序(Linux 主机)运行。
日志收集器配置通过 Graylog Web 界面集中管理。Sidecar 守护进程将定期使用REST API获取目标的所有相关配置。
在第一次运行时,或者当检测到配置更改时,Sidecar 将生成(呈现)相关的后端配置文件。然后它将启动或重新启动
那些重新配置的日志收集器
开始部署
之前Graylog已经部署过,这里就不在部署Graylog的服务端,可以参考之前的之前的博客
https://editor.youkuaiyun.com/md/?articleId=120563987
在客户端安装 Sidecar
安装:
采用RPM包来安装,这个要在需要收集日志的机子上安装
下载地址 https://github.com/Graylog2/collector-sidecar/releases
直接rpm 安装即可
rpm -ivh graylog-sidecar-1.1.0-1.x86_64.rpm
配置:
vim /etc/graylog/sidecar/sidecar.yml
server_url: "http://192.168.1.1:9000/api/" #graylogserver的api地址
server_api_token: "" #这是验证密钥,我们需要在graaylog的server端生成后,再回来填上,这里先空着,
#作用sidecar客户端验证
node_name: "APIServer1" #用于识别是那台sidecar发来的日志信息
update_interval: 10 #多久 Sidecar 向 Graylog 报告一次自己的运行状况,以及抓取最新下发的配置文件。
send_status: true # 是否向 Graylog 报告自己的状态信息。
启动:
graylog-sidecar -service install && systemctl start graylog-sidecar && systemctl enable graylog-sidecar
#这里可能无法正常启动,应为我们的server_api_token是空的,待会配置上在重启下服务
在客户端安装 Filebeat
安装:
我们同样采用RPM包安装,这个要在需要收集日志的机子上安装
下载地址: https://www.elastic.co/cn/downloads/beats/filebeat
直接rpm 安装即可
rpm -ivh filebeat-7.15.0-x86_64.rpm
配置:
这里Filebeat只是个采集工具,可以直接使用Sidecar 去调用,不需要配置,直接启动就可以了
启动:
systemctl enable filebeat && systemctl start filebeat
在Server服务端添加Sidecar
去服务端添加Sidecar,刚刚我们配置的客户端,用于收集那台机器的日志。
- 添加 Sidecar 秘钥
还记得前面配置空的那个server_api_token
么,现在就去生成。
这时候在重启客户端的graylog-sidecar服务就正常了。
- 设置inputs接入日志
输入的类型选择beats
填写一些输入信息的参数
注意:上图的Bind Address:是填写安装Sidecar客户端的IP,应为我是和服务端安装在一台机器上了,所以就写了0.0.0.0
保存后就可以看到有一个接入口。如下图
3. 通过server 对 Sidecar 进行配置,收集filebeat日志
图中的配置文件
# Needed for Graylog
fields_under_root: true
fields.collector_node_id: ${sidecar.nodeName}
fields.gl2_source_collector: ${sidecar.nodeId}
filebeat.inputs: # 输入方式,是Filebeat
- input_type: log
paths:
- /var/log/*.log # 日志目录
type: log # 输入类型 log
- input_type: log
paths:
- /data/nginx/logs/access.log # 在收集Nginx访问记录日志
type: log
tags: -Nginx-succeed # 可以打个标签
- input_type: log
paths:
- /data/nginx/logs/error.log # 在收集Nginx 错误日志
type: log
tags: Nginx-error
output.logstash:
hosts: ["127.0.0.1:5044"] # 定义Sidecar的客户端的地址和端口
path:
data: /var/lib/graylog-sidecar/collectors/filebeat/data # 从Filebeat搜集后暂存的数据目录
logs: /var/lib/graylog-sidecar/collectors/filebeat/log # 从Filebeat搜集后暂存的日志目录
现在返回主页,就可以看到搜集的日志了
下面是两个其他模板,供修改参考
模板一:
# Needed for Graylog
fields_under_root: true
## ↑ 用于定义你的特别字段,比如下面那些。这些被标记为 under_root 的数值拥有最高优先级,会覆盖掉任何在这
## 之后的字段。按排列的先后顺序覆盖,比如你如果写了两个 fields.source,那么只有最靠前的会生效;如果你在
## 下面的 fleids 里自定义了 fields.source,也会被这里面 under_root 的给覆盖掉。
fields.collector_node_id: ${sidecar.nodeName}
## ↑ 这个 “sidecar.nodeName” 变量,就是在配置 Sidecar 时候提到的那个 “nodeName”,记起来了吗?这个用于
## 图表统计和消息分类很有必要。
fields.source: ${sidecar.nodeName}
## ↑ 一定要留意加入了这行配置!!否则日志展示界面 “Source” 会提示 “unknown”,
## 图表也会很难做,因为你再多服务器,也只有一个来源 “unknown”。另外说回为什么上面
## “Do not add Beats type as prefix” 要勾选的问题。如果那个勾没打,那么这里的 “fields.source” 和
## “sidecar.nodeName” 都会不叫这个名字,也就是说你这套配置你套进去,“Source” 一样是 “unknown”,因为
## 它根本不叫 “fields.source” 。叫啥我还没摸出来,总之打钩后,按我调的这套配置是没问题的。
fields.gl2_source_collector: ${sidecar.nodeId}
# AAA API #这里创建第一个 filebeat.inputs 配置。
filebeat.inputs:
- type: log #指定日志收集类型,因为是收集 tomcat 日志,所以 type 是 log。
paths:
- /data/service/service1/logs/catalina-daemon.out
## ↑ 指定日志位于哪个路径,可以用“*”号,或者写多行“-”的方式来指定多个路径。
multiline.pattern: '^[[:space:]]+(?:at\b|\.{3}\B)|^Caused by:'
## ↑ 这里很重要,这个是决定 Filebeat 能不能收集 Java 堆栈日志这种多行日志的配置。
## 这个正则和相关参数可以照抄。不要用 Filebeat 官方的正则,那个正则是错误的。
multiline.negate: false
multiline.match: after
tags: Catalina-AAAAPI
## ↑ 打了这个 tags 后,这些附加信息会随着 Filebeat 的信息流一起传过来,可以更易于分类消息是从哪个地方
## ,或哪个服务采集来的,这个对后面做分类搜索——也就是 Stream 会用到,也算是很重要的一个配置,否则你多个
## 服务发来的日志经由同一个 Input 进来,所有日志都没有标记特征信息,会变得很难以区分。
## 还有一个用法是写 fields,比如:
# fields:
# server: aaaapi-catalina
## 这个 field 实际上是一个自定义的“key: value”,你可以写任何东西,比如我上面
## 写了 “server: mobileapi-catalina”,你可以写成类似
## “foo: bar” 等任何东西,这个 fields 的作用跟上面的 tags 类似,只不过 tags 更“正式化”一点
## 用 Filebeat 和 Logstash 对接过的人应该知道这个用法。
# BBBAPI
## ↑ 不赘述了,配置一样,但是注意 “filebeat.inputs” 只写一次,不要重复写了!!重复写只会
## 生效最靠近底下的一个。
- type: log
paths:
- /data/service/service2/logs/catalina-daemon.out
multiline.pattern: '^[[:space:]]+(?:at\b|\.{3}\B)|^Caused by:'
multiline.negate: false
multiline.match: after
tags: Catalina-BBBAPI
# CCC Service
- type: log
paths:
- /data/service/service3/logs/catalina-daemon.out
multiline.pattern: '^[[:space:]]+(?:at\b|\.{3}\B)|^Caused by:'
multiline.negate: false
multiline.match: after
tags: Catalina-CCC
# Metabase
## ↑ 这里比较例外,Metabase 是个用 Docker 起的服务,所以这里的 type 是 docker
- type: docker
## ↑ 这个写法其实局限性极大,应该说 filebeat 收集单容器(没上 K8s)都很局限性,
## 因为只支持容器 ID 或容器的日志路径,你更新一次容器,ID 就变了,但K8s 支持容器名定义。
containers.ids:
## ↑ 这里指定了一个容器 ID,能不能写短 ID 我没测,应该理论上是没问题的。
- 'a67b30747290fc0e31f3cbfdc494fef20f54aed29cdc7d8b842ed6f3b3bad9c2'
tags: Docker-Metabase # tags 用法,不赘述了
multiline.pattern: '^.|^\#+'
## ↑ 这个也是为了匹配多行日志的,metabase 会有一些很神奇的日志格式,比如 echo 上色什么的,
## 这些对 Filebeat 很不友好,
## 因为会抓到大量的中括号和斜杠以及 “#” 号等乱七八糟的东西。
multiline.negate: false
multiline.match: after
output.logstash:
## ↑ 这里指定将收集到的日志输出到哪里
hosts: ${user.hostIP}
## ↑ 调用了一个参数 ${user.hostIP},这个参数可以在右侧的“Variables”选项卡设置。
## 你只需要起名和填写内容就行了,## 这里写我们在 Input 里配置的信息,比如我没有在 Graylog-server
## 的配置中启用 bind,所有 Sidecar 都在一个大内网,端口是 5044,那么## 就是172.××.×.111:5044。
## Save 后会自动生成一个参数名,比如上面的 ${user.hostIP}
path: #这两行是用于覆写 filebeat 日志输出记录的配置
data: /var/lib/graylog-sidecar/collectors/filebeat/data
logs: /var/lib/graylog-sidecar/collectors/filebeat/log
模板二:
# Needed for Graylog
fields_under_root: true
fields.collector_node_id: ${sidecar.nodeName}
fields.gl2_source_collector: ${sidecar.nodeId}
### Nginx-access ###
filebeat.inputs:
- input_type: log
paths:
- /var/log/nginx/access.log
type: log
tags: 192.168.12.161-Nginx-succeed
### Nginx-erro ###
- input_type: log
paths:
- /var/log/nginx/error.log
type: log
tags: 192.168.12.161-Nginx-fail
### Nginx-xintong ###
- input_type: log
paths:
- /var/log/*
type: log
tags: 192.168.12.161-xitong
### tomcat ###
- input_type: log
paths:
- /var/log/nginx/rizhi/catalina.out-20210923
multiline.pattern: '^[[:space:]]+(?:at\b|\.{3}\B)|^Caused by:'
multiline.negate: false
multiline.match: after
type: log
tags: 192.168.12.161-tomcat
### nginx-test ###
- input_type: log
paths:
- /var/log/nginx/rizhi/nginx-test.log
multiline.pattern: '^[[:space:]]+(?:at\b|\.{3}\B)|^Caused by:'
multiline.negate: false
multiline.match: after
type: log
tags: 192.168.12.161-Nginx-test
output.logstash:
hosts: ["192.168.12.161:5044"]
path:
data: /var/lib/graylog-sidecar/collectors/filebeat/data
logs: /var/lib/graylog-sidecar/collectors/filebeat/log
通过Nginx日志做地图标识
- 截取IP字段
- 配置 GeoLite2-City,将IP字段转换为物理位置
①.下载GeoLiteCity,
下载地址:https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
需要邮箱注册一个用户,登陆即可免费下载,下载的是一个 GeoLite2-City.mmdb的二进制格式数据库,
里面存储的就是ip和地理位置的信息,把这个文件放到 server端 /etc/graylog/server/GeoLite2-City.mmdb
要注意的是,为了保证数据的准确性,这个数据库文件尽可能的每隔一段时间去重新下载,替换下。
保证转换的是最新的地址
如果觉得不方便,博主提供了一份2021-9月的地图数据,供你测试 https://mp.youkuaiyun.com/mp_download/manage/download/UpDetailed
② 上传到server端 ,/etc/graylog/server 下
③ 去web端配置Geopip插件
④. 把Gpio插件顺序调到最下面
3. 新建一个地图仪表盘
可以看到,我们左侧已经有提取的IPV4字段和相应的城市以及位置信息
======================================================================================================================================================================================================================================================================================================
辛苦浏览观看,如果对你有帮助,请顺手点个赞吧 (σ゚∀゚)σ…:*☆