共计 7596 个字符,预计需要花费 19 分钟才能阅读完成。
日志剖析零碎能够实时收集、剖析、监控日志并报警,当然也能够非实时的剖析日志。splunk 是功能强大且用起来最省心的,然而要免费,免费版有每天 500M 的限度,超过 500M 的日志就没法解决了。ELK 零碎是最常见的,毛病是配置麻烦一些,比拟重量级。graylog 是开源收费的,配置上要比 ELK 零碎简略。综上,本文尝试容器形式搭建一套 graylog 零碎,不做实时收集日志和报警的配置,只实现非实时被动接管网站日志,剖析日志各项指标的性能。
docker 官网镜像国内速度我感觉慢,改成国内镜像。新建文件 daemon.json 如下
vi /etc/docker/daemon.json
{"registry-mirrors": ["https://registry.docker-cn.com"]
}
也能够用网易镜像 http://hub-mirror.c.163.com
配置完重启 docker 能力失效
#service docker restart
拉取如下三个镜像
docker pull mongo:3
docker pull docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10
docker pull graylog/graylog:3.3
不要急着依照网上的办法启动镜像,我开始 docker 启动 elasticsearch,尽管显示启动胜利,但过半分钟后偷偷退出,这导致 graylog 在浏览器打不开。最初通过查看容器启动时的日志,发现 elasticsearch 对于零碎参数是有要求的,按如下批改。
在 /etc/sysctl.conf 文件最初增加一行
vm.max_map_count=262144
vi /etc/security/limits.conf
* - nofile 102400
批改实现后重启零碎使变量失效。
docker 启动 elasticsearch 时要加上参数
--ulimit nofile=65536:65536 --ulimit nproc=4096:4096
,确保容器内环境满足要求,否则在 docker pa - a 命令下会看到 exit(78)或 exit(1)的容器异样退出谬误。
查看容器启动报错最精确的办法是“docker logs -f 容器 ID”这个命令,咱们不加 –ulimit 参数试试
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e4a811093d9 docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10 "/usr/local/bin/dock 6 seconds ago Up 4 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
用下面的 CONTAINER ID 产看启动时的日志
[root@bogon ~]# docker logs -f 7e4a811093d9
最初会打印出
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max number of threads [3869] for user [elasticsearch] is too low, increase to at least [4096]
[2020-08-27T06:10:25,888][INFO][o.e.n.Node] [WG6mVz4] stopping ...
[2020-08-27T06:10:25,903][INFO][o.e.n.Node] [WG6mVz4] stopped
[2020-08-27T06:10:25,903][INFO][o.e.n.Node] [WG6mVz4] closing ...
[2020-08-27T06:10:25,928][INFO][o.e.n.Node] [WG6mVz4] closed
两行 too low 的提醒就是容器退出的起因。
三个容器正确的启动命令如下
docker run --name mongo -d mongo:3
docker run --name elasticsearch \
-e "http.host=0.0.0.0" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
--ulimit nofile=65536:65536 --ulimit nproc=4096:4096 \
-p 9200:9200 -p 9300:9300 \
-d docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10
docker run --name graylog --link mongo --link elasticsearch \
-p 9000:9000 -p 12201:12201 -p 1514:1514 -p 5555:5555 \
-v /home/graylog/geodata:/usr/share/graylog/log \
-e GRAYLOG_HTTP_EXTERNAL_URI="http://192.168.56.106:9000/" \
-d graylog/graylog:3.3
mongo 的启动没什么可说的。
elasticsearch 的 –ulimit 必须加否则启动后退出,-p 9200:9200 是治理端口,未来删除数据须要拜访这个端口。
graylog 9000 端口是零碎界面,5555 是开的 tcp 端口,用于被动接管日志数据的。
-v /home/graylog/geodata:/usr/share/graylog/log
是把本地 /home/graylog/geodata 挂载到容器的 /usr/share/graylog/log 目录,我这么配置是为了让 graylog 能读到 GeoLite2-City.mmdb 地理信息数据库,这个库是把 ip 和地理位置对应起来了。原本想把它拷贝到容器里,但报错
[root@localhost graylog]# docker cp ./GeoLite2-City.mmdb 151960c2f33b:/usr/share/graylog/data/
Error: Path not specified
说是要降级 docker1.7 到更高版本,不想降级,改成挂载办法了。如果不想挂载什么文件,- v 这行参数能够去掉。
我是用命令“#docker exec -it graylog 容器 ID bash” 先进入容器,看到容器内 /usr/share/graylog/log 目录没什么货色,所以抉择挂载到这个目录的。
天文数据用于显示拜访网站的 ip 散布在哪个城市国家,还有世界地图的显示。须要在 https://dev.maxmind.com/zh-ha…,麻烦的是这里须要注册。我下载的是 GeoLite2-City_20200825.tar.gz,解压后有 GeoLite2-City.mmdb,上传这个文件到 Linux 的 /home/graylog/geodata 目录,这个文件是须要挂载到容器,给 graylog 应用的。
不想注册请从上面链接下载
链接:https://pan.baidu.com/s/1Lovr…
niI66CkmA
提取码:bsmm
GRAYLOG_HTTP_EXTERNAL_URI 的地址不要写 127.0.0.1,这样如果在 Linux 的内部拜访,尽管能通,然而网页是空白一片,要写 Linux 对外的 ip 地址,这样在内部浏览器关上才失常。
另外 graylog 的启动是依赖于 mongo 和 elasticsearch 的,等其它两个都胜利启动,再启动 graylog。
上面开始演示如果配置 graylog 零碎,并且剖析网站的 Apache 规范格局的日志。大略步骤如下
配置 input-> 给 input 配置 extractor-> 配置地理信息数据库 -> 手动输出日志 -> 剖析日志。
浏览器输出 http://192.168.56.106:9000/ 用户名和明码都是 admin,登陆进 graylog 零碎。
system->input,
点击 select input 右侧的下拉箭头,呈现下拉列表,抉择 raw/plaintext TCP
而后点击 Lanch new input,Node 下拉惟一抉择给选上,Title 随便起名,Port 写 5555,因为咱们 docker 启动参数写的 -p 5555:5555 这两个必须保持一致。
其它不必填点击下方 SAVE 按钮,会主动启动该 input,能够看到 local inputs 下方减少了方才的配置。其实当初用 cat access.log | nc localhost 5555 等命令给 5555 端口发送日志数据,数据就能够进入到 graylog 零碎,并且能够进行简略的搜寻了。但这种搜寻是最根底的字符串匹配,价值不大。咱们要剖析日志的各项指标,并且生成图表,必须让零碎能解析每条日志的各个 field(字段或域值),例如 clientip 就是一个 field,request 也是一个 field。要解析出 field 要给 input 配置 extractor,点击 Manager exactor。
Extractors JSON 里贴入上面内容
{
"extractors": [
{
"title": "commonapache",
"extractor_type": "grok",
"converters": [],
"order": 0,
"cursor_strategy": "copy",
"source_field": "message",
"target_field": "","extractor_config": {"grok_pattern":"%{COMMONAPACHELOG}"},"condition_type":"none","condition_value":""
}
],
"version": "3.3.5"
}
最初点击 add extrators to input,显示 successful 即可。
到这里曾经能够正确解析日志得 field 了。然而如果咱们想剖析和地理位置相干的信息,还必须配置地理信息数据库,上文下载的 mmdb 文件。
system->configurations,最右下方有一项 Geo-Location Processor,点击改我的项目下方的 update 按钮
配置实现,点击 save。
Configurations 最上方 Message Processors Configuration 下方表格里要把 GeoIP Resolver 放在表格的最下方。点击表格下方的 update
鼠标按住 GeoIP Resolver 往下方拖,
实现后点击 save。Message Processors Configuration 表格的 GeoIP Resolver 到了最下方。
上面是手动输出日志到 input 了,我将 access2020-07-06.log 放到了 Linux 目录下,在目录下执行
# cat access2020-07-06.log | head -n 10000 | nc localhost 5555
命令是将 log 从头开始的 10000 行日志发送到本机的 5555 端口,因为 graylog 的 input 配置的也是 5555 端口,docker run graylog 时命令参数也是 -p 5555:5555,只有这三处保持一致,这个命令是肯定能胜利的。这里命令 nc、ncat、netcat 三个都能达到同样的成果。
导入实现后,抉择 graylog 最上方的 search 选项
上方的按钮是查问工夫范畴,这个工夫是日志导入的工夫,不是日志自身记录申请的工夫,如果要查全副间接抉择 search in all messages
下方放大镜按钮就是搜寻,前方能够增加搜寻关键字,或者某个 field 的限度,有很多搜寻语法十分不便,点击搜寻后,不符合条件的日志记录会被去除。
下方 All Messages 就是符合条件的原始的日志后果。
如果想统计拜访来源于哪些城市,点击左侧边栏最下的 X(field)形按钮。抉择 clientip_cityname->show top values
鼠标点击右侧灰色区域,回到主界面,拜访起源的城市信息曾经在列表里了。
N/ A 示意的是有大量申请辨认不出 ip 所在的城市,这有可能是咱们的地理信息数据库不全不新,或者有些 192 172 这种内网地址的拜访无奈辨认地区,这里不重点探讨了。如果要剔除 N / A 数据,只看可辨认城市的散布,鼠标放到 N / A 右侧,会呈现下拉菜单的箭头,点击箭头,抉择 exclude from results,N/ A 的数据就会去除,下面的搜寻栏内也会主动减少这个筛选条件,
留神当初的统计是剔除了 N / A 的数据,数据范畴理论是比全副日志范畴放大了的,这在理论利用中很有价值,很多状况下咱们统计某些指标,就是要看某个部分范畴的。上面咱们看看拜访起源城市的统计图,点击右上角下拉箭头,抉择 Edit
点击左侧 Date Table 处下拉菜单,能够看到柱状图、饼状图、散点图等都列在外面,抉择哪个右侧就会呈现那种统计的图表。
如果要展现拜访起源在世界地图的散布,field 菜单抉择 clientip_geolocation->show top values,
弹出的统计表格是经纬度坐标的拜访次数。和下面图标一样,进入 Date Tabel 下拉菜单,最下方有 world map
抉择会显示地图统计后果,放大调整地位如下图
其它指标的统计如 request 散布,拜访工夫散布,在 field 下列表里都有,依据须要按下面同样操作。地理信息数据和规范的 Apache 日志能够联合失效,但一些自定义的 extractor 是否失效是不肯定的。
番外篇
给 input 配置 extractor,下面配置的是规范的 Apache 格局日志,如果日志格局是 nginx 或者自定义的怎么办呢?
graylog 提供了给日志配置 extractor 的性能,假如咱们配置完 input,没有给 input 配置 extractor,间接导入日志,按如下步骤配置 extractor
input 界面抉择 manager extractor
getstarted
load message 会将刚进入的日志中的一条显示进去,点击 message 地位的 select extractor type,示意咱们要对 message 也就是整条信息配置 extractor,下拉菜单抉择 Grok Pattern。如果日志进入工夫比拟久,load message 无奈展现日志,须要通过旁边 message ID 的标签来搜寻日志,须要提供 message ID 和 index,这两个参数在搜寻界面下方 all message 里,轻易点击一条日志数据,开展就能够看到。message ID 形如 4b282600-e8d2-11ea-b962-0242ac110008,index 形如 graylog_0。
进入 Extractor configuration,外面的 pattern 要本人填写,能够在右侧已有的 pattern 抉择若干个组合,也能够本人定义,这里须要对 grok 和正则语法纯熟了。我这里填写的是解析 nginx 原生日志的 pattern 格局,也是网上搜寻的。填写完点击 try against example,如果解析胜利,下方会表格模式列出各个 field 对应该条日志的值。不胜利就会报错,须要批改 pattern 直到不报错。
我的 pattern 如下
^%{IPORHOST:clientip} (?:-|%{USER:ident}) (?:-|%{USER:auth}) \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|-)\" %{NUMBER:response} (?:-|%{NUMBER:bytes})([\s\S]{1})\"(?<http_referer>\S+)\"([\s\S]{1})\"(?<http_user_agent>(\S+\s+)*\S+)\".*%{BASE16FLOAT:request_time}
解析胜利,Extractor title 轻易起个名,点击最下方 create extractor
extractor 曾经胜利增加给 input 了,下面的 action 有 export extractor,点击能够以 json 格局展现方才配置的 extractor。
拷贝这个 json 文本,保留在本地,当前遇到 nginx 原生格局日志,间接通过下面的 import extractor 就间接应用,不必在配置 grok pattern 测试了。
须要阐明的是一条日志记录有没有被解析为各个 field,取决于日志进入零碎时,有没有配置 extractor。后配置的 extractor 对在之前的日志是起不到解析作用的。
如果配置完 extractor,雷同格局日志只进入零碎一小部分,不要找其它起因了,起因就是 pattern 不对,尽管测试通过了,也配上了,然而还须要你从新批改 pattern,如果 pattern 正确,合乎格局的日志应该全都进入零碎。
对于有些日志格局,配置 grok pattern 须要大量调试,graylog 调试并不不便,官网 grok 调试器网站国内都打不开了。上面提供一个工具,能够间接粘贴日志到页面调试
链接:https://pan.baidu.com/s/1gWX4…
提取码:t6q6
windows 的 cmd 间接 java -jar GrokConstructor-0.1.0-SNAPSHOT-standalone.jar
而后浏览器拜访 127.0.0.1:8080,点击 matcher,下面填写日志,下方填写 grok pattern,
点击 go,如果胜利解析,会表格模式展现解析各个 field 后果。
ramdom example 给出了一些常见日志的例子和对应的 pattern 格局。
如果要重新配置 graylog 和输出数据,先
docker stop $(docker ps -a -q)
进行所有容器,而后
docker rm $(docker ps -a -q)
删除所有容器,而后 docker run 按程序启动三个容器,这样启动的容器是全新的,之前的配置和数据都会失落。
上面对容器的操作麻烦,能够应用
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
装置 docker-compose,将启动参数等要求写到 docker-compose.yml 文件里,这种形式操作命令会很简略。