当前位置: 首页 > Linux

graylog日志分析系统教程

时间:2023-04-06 02:30:05 Linux

日志分析系统可以对日志进行实时的采集、分析、监控和告警,当然也可以进行非实时的日志分析。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生效#servicedockerrestartpulls以下三张镜像dockerpullmongo:3dockerpulldocker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10dockerpullgraylog/graylog:3.3no急着按照网上的方法启动镜像,启动docker启动elasticsearch。虽然显示启动成功,但是半分钟后悄悄退出,导致graylog无法在浏览器中打开。最后通过查看容器启动时的日志,发现elasticsearch对系统参数有要求,修改如下即可。在/etc/sysctl.conf文件末尾添加一行vm.max_map_count=262144vi/etc/security/limits.conf*-nofile102400。修改完成后重启系统使变量生效。docker启动elasticsearch时,加入参数--ulimitnofile=65536:65536--ulimitnproc=4096:4096,确保容器内的环境符合要求,否则会看到exit(78)或exit(1)容器异常退出并报错。检查容器启动错误最准确的方法是命令“dockerlogs-fcontainerID”。让我们尝试不使用--ulimit参数[root@bogon~]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES7e4a811093d9docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10"/usr/local/bin/dock6secondsagoUp4秒0.0.0.0:9200->9200/tcp,0.0.0.0:9300->9300/tcpElasticsearch使用上面的CONTAINERID在启动时查看日志[root@bogon~]#dockerlogs-f7e4a811093d9will最后打印出[1]:elasticsearch进程的最大文件描述符[4096]太低,增加到至少[65535][2]:用户[elasticsearch]的最大线程数[3869]太低,增加到at至少[4096][2020-08-27T06:10:25,888][INFO][o.e.n.Node][WG6mVz4]停止...[2020-08-27T06:10:25,903][INFO][o.e.n.Node][WG6mVz4]停止[2020-08-27T06:10:25,903][INFO][o.e.n.Node]e][WG6mVz4]closing...[2020-08-27T06:10:25,928][INFO][o.e.n.Node][WG6mVz4]closed两行提示太低是容器退出的原因。三个容器的正确启动命令如下dockerrun--namemongo-dmongo:3dockerrun--nameelasticsearch\-e"http.host=0.0.0.0"\-e"ES_JAVA_OPTS=-Xms512m-Xmx512m"\--ulimitnofile=65536:65536--ulimitnproc=4096:4096\-p9200:9200-p9300:9300\-ddocker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10dockerrun--namegraylog--linkmongo--linkelasticsearch\-p9000:9000-p12201:12201-p1514:1514-p5555:5555\-v/home/graylog/geodata:/usr/share/graylog/log\-eGRAYLOG_HTTP_EXTERNAL_URI="http://192.168.56.106:9000/"\-dgraylog/graylog:3.3mongo启动没什么好说的。Elasticsearch的--ulimit必须加上,否则启动后会退出,-p9200:9200是管理端口,以后删除数据需要访问这个端口。Graylog9000端口是系统接口,5555端口是一个开放的tcp端口,用于被动接收日志数据。-v/home/graylog/geodata:/usr/share/graylog/log是将本地的/home/graylog/geodata挂载到容器的/usr/share/graylog/log目录下。我这样配置是为了让graylog可读进入GeoLite2-City.mmdb地理信息数据库,这个库将ip对应到地理位置。本来想复制到容器中,结果报错[root@localhostgraylog]#dockercp./GeoLite2-City.mmdb151960c2f33b:/usr/share/graylog/data/Error:Pathnotspecifiedsaidtoupgradedocker1.7到更高版本,不想升级,改成挂载方式。如果不想挂载任何文件,可以去掉-v参数。我先用命令“#dockerexec-itgraylog容器IDbash”进入容器,看到容器中的/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提取码:bsmmGRAYLOG_HTTP_EXTERNAL_URI地址不要写127.0.0.1,所以如果你在linux外访问,虽然可以通过,但是网页是空白的,需要写linux对外的ip地址,这样才能在外部浏览器打开才正常。另外,graylog的启动依赖mongo和elasticsearch,等待另外两个启动成功,再启动graylog。下面开始演示如何配置graylog系统,分析网站Apache标准格式的日志。大致步骤如下:配置输入->配置输入提取器->配置地理信息数据库->手动输入日志->分析日志。在浏览器中输入http://192.168.56.106:9000/,用户名和密码都是admin,登录graylog系统。system->input,点击selectinput右边的下拉箭头,出现一个下拉列表,选择raw/plaintextTCP然后点击Lanchnewinput,Node的下拉只有一个选项选择,Title随意命名,Port写5555,因为我们docker启动参数写-p5555:5555这两个必须一致。点击下方的SAVE按钮开始自动输入,可以看到本地输入下已经添加了刚才的配置。其实现在用cataccess.log|之类的命令nclocalhost5555向5555端口发送日志数据,数据可以进入graylog系统,可以进行简单的搜索。但是这种查找是最基本的字符串匹配,价值不大。系统要对日志的各项指标进行分析并生成图表,就必须能够解析每条日志的各个字段(字段或字段值)。比如clientip是一个字段,request也是一个字段。要解析字段,为输入配置提取器,单击管理器提取器。将以下内容粘贴到ExtractorsJSON{"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"}最后点击addextractors输入即可显示成功。至此,可以正确解析日志的字段。但是如果我们要分析地理位置相关的信息,还必须配置一个地理信息数据库,就是上面下载的mmdb文件。system->configurations,右下方有个Geo-LocationProcessor,点击项目下方的更新按钮完成配置,点击保存。在配置顶部的消息处理器配置下方的表格中,GeoIP解析器应放在表格的底部。点击表格下方的update,按住鼠标向下拖动GeoIPResolver,完成后点击save。消息处理器配置表单的GeoIP解析器位于底部。下面是手动将日志输入到input中。我把access2020-07-06.log放在linux目录下,执行#cataccess2020-07-06.log|头-n10000|在保存日志的目录下执行nclocalhost5555命令将开头的10000行日志发送到本机的5555端口。由于graylog的输入配置也是5555端口,docker运行graylog时命令参数也是-p5555:5555。只要这三点一致,这个命令就一定会成功。的。这里的nc、ncat、netcat命令可以达到同样的效果。导入完成后,选择graylog顶部搜索选项上方的按钮,查询时间范围。这个时间是日志导入的时间,不是日志本身记录请求的时间。如果要搜索全部,直接在所有消息中选择搜索下方的放大镜按钮进行搜索,可以在某个字段中添加搜索关键词或限制条件。有许多非常方便的搜索语法。点击搜索后,不符合条件的日志记录将被移除。下面的AllMessages是符合条件的原始日志结果。如果要统计访问量来自哪些城市,请单击左侧边栏底部的X(字段)按钮。选择clientip_cityname->showtopvalues点击右侧灰色区域返回主界面。访问源的城市信息已在列表中。N/A表示有大量请求无法识别ip所在城市。这可能是因为我们的地理信息数据库不完整或者是最新的,或者访问一些内网地址如192172无法识别地区,这里不做讨论。如果要排除N/A数据,只看可识别城市的分布,将鼠标放在N/A右侧,会出现下拉菜单的箭头。单击箭头并选择从结果中排除,N/A数据将被删除。该过滤条件也会自动添加到.需要注意的是,目前的统计不包括N/A数据,数据范围实际上比所有日志的范围都窄。这在实际应用中非常有价值。很多时候,我们统计某些指标取决于某个地方。我们来看看源城市的统计图。点击右上角的下拉箭头,选择编辑,点击左侧日期表的下拉菜单。可以看到里面列出了直方图、饼图、散点图。这种统计数据的图表将出现在侧面。如果想在世界地图上显示访问源的分布情况,在字段菜单中选择clientip_geolocation->showtopvalues,弹出的统计表就是带有经纬度坐标的访问量。同上图,进入DateTab下拉菜单,最下方的世界地图选择会显示地图统计结果,放大调整位置如下图其他指标的统计,比如请求分布和访问时间分布,在字段下的列表中可用,根据需要执行与上述相同的操作。地理信息数据和标准Apache日志可以结合生效,但不确定某些自定义提取器是否生效。额外的章节配置了输入的提取器,它配置了标准的Apache格式日志。日志格式是nginx还是custom怎么办?Graylog提供了配置日志提取器的功能。假设我们配置了输入,没有为输入配置extractor,直接导入日志,按照下面的步骤配置extractor输入界面,选择managerextractorgetstartedloadmessage,显示其中一条新输入的日志。点击消息位置的selectextractortype,表示我们要为消息配置extractor,也就是整条消息,在下拉菜单中选择GrokPattern。如果日志输入时间较长,加载消息无法显示日志。您需要通过消息ID旁边的标签来搜索日志。您需要提供消息ID和索引。这两个参数在搜索界面下方的allmessage中。如您所见,单击日志数据展开。消息ID格式为4b282600-e8d2-11ea-b962-0242ac110008,索引格式为graylog_0。进入Extractor配置,里面的pattern需要自己填写。您可以从右侧现有的图案中选择几种组合,也可以自己定义。在这里,你需要精通grok和正则语法。我这里填的是解析nginx原生日志的pattern格式,也是网上搜的。填写完成后点击tryagainstexample。如果解析成功,日志对应的各个字段的值会以表格形式列在下方。不成功会报错,需要修改pattern直到不报错。我的模式如下^%{IPORHOST:clientip}(?:-|%{USER:ident})(?:-|%{USER:auth})\[%{HTTPDATE:timestamp}\]\"(?:%{WORD:verb}%{NOTSPACE:request}(?:HTTP/%{NUMBER:httpversion})?|-)\"%{NUMBER:response}(?:-|%{NUMBER:bytes})([\s\S]{1})\"(?\S+)\"([\s\S]{1})\"(?(\S+\s+)*\S+)\".*%{BASE16FLOAT:request_time}解析成功,Extractor标题可以随意命名,点击最下方的createextractor已经成功将extractor添加到input中,上面的action有exportextractor,点击显示提取器刚刚以json格式配置。复制json文本并保存到本地。以后遇到nginx原生格式的日志,可以通过上面的importextractor直接使用,不需要配置grokpatterntest。需要注意的是,一条日志记录是否被解析成各个字段取决于日志进入系统时是否配置了抽取器。后面配置的提取器将无法解析之前的日志。如果配置了提取器,相同格式的日志只会进入系统的一小部分。不要寻找其他原因。原因是模式不对。虽然测试通过了,也匹配上了,但是还是需要修改一下pattern。如果模式正确,则符合格式。的日志应该都进入系统。对于某些日志格式,配置grok模式需要大量调试。Graylog调试不方便,grok调试器官方网站在国内打不开。这里有一个工具可以直接把log粘贴到页面调试链接:https://pan.baidu.com/s/1gWX4...提取码:t6q6windowscmddirectjava-jarGrokConstructor-0.1.0-SNAPSHOT-standalone.jar并在浏览器中访问127.0.0.1:8080,点击matcher,上面填写log,下面填写grokpattern,点击go,如果解析成功,解析各个字段的结果将以表格形式显示。ramdom示例给出了一些常见的日志示例和相应的模式格式。如果要重新配置graylog和输入数据,先dockerstop$(dockerps-a-q)停止所有容器,然后dockerrm$(dockerps-a-q)删除所有容器,然后dockerrun启动三个containersinorder,这样启动的容器是全新的,之前的配置和数据都会丢失。上面容器的操作比较麻烦,可以使用curl-Lhttps://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文件。这种操作命令的方式会非常简单。