当前位置: 首页 > 后端技术 > Java

分布式日志组件GrayLog入门

时间:2023-04-01 23:08:41 Java

本人3y,markdown程序员,一年CRUD经验,十年经验嘛,最后留一个TODO:运行应用的服务器一般都是集群,并且日志数据会记录在不同的机器上,所以只能登录到每台服务器进行排查和定位问题。今天就来聊聊这个话题。00.为什么需要分布式日志组件?在文章正式开始之前,先分享一个我之前负责的系统。它的架构是这样的:每次检查一个问题,我可能可以初步定位到逻辑层的问题,但是为了向业务方解释,我需要向业务方展示证据(日志信息是铁证)。一个请求必须由这8台机器中的一台来处理,但是是哪一台,我不知道。因此,我需要在每台机器上grep一条日志,然后才能找到对应的日志来证明我的分析。有的时候,接入层可能也需要一起参与,就为了排查一个问题,人傻(翻日志的时间太长了)。后来看到同事的风骚操作(在item2写了个脚本:快速登录堡垒机(不用输入账号密码信息),根据应用服务器数量切窗,切换到对应的日志目录)。说白了就是一键登录多个应用服务器。嗯,查看日志的速度比以前快多了。后来公司运维端主要推广了网页登录应用服务器(自动登录堡垒机),省去了写脚本(支持批量操作)。但是从当时的体验来看,item2的访问并不顺畅(总感觉卡住了)。但是还是有问题,因为我们经常不知道info/warn/error下面是哪个文件。大多数时候,您只能一个一个地检查文件。虽然可以直接用通配符搜索,但是如果日志太大,导致卡顿会很烦人。一旦系统被问到业务问题,检查日志的频率就太高了。所以在策划某Q的时候,就想自己把日志信息写到搜索引擎上,顺便学习一下搜索引擎的知识。然后这个方案被群里的一个大佬看到了,在下面评论说:不如试试Graylog吧?原来是群里自己在维护一个日志框架,但是我不知道……于是我连接上了Graylog日志,工作效率大大提高了。借着这件事,我吹了一个Q。自从连上后,我就没有登录过应用服务器,差点连一次grep都写不出来。01.轻量级ELK(Graylog)说起ELK,即使没用过,也一定听说过。它在后端非常受欢迎。这次austin连接的是一个比较轻量级的ELK框架:我觉得Graylog框架还是蛮好用的,作为用户连接起来也很简单(估计运维应该挺简单的,很多人用Graylog来直接发送UDP给Server,不需要在机器上安装代理收集日志)一张图顶十个字:官方文档:https://docs.graylog.org/docs据我所知,不少公司用它来查看日志和业务监控告警,本文就让大家直接体验一下。02.同样的方法部署Graylog,直接进入docker-compose,如果你一直跟着我的步骤走,应该不会陌生。docker-compose.yml的内容其实是从官网复制过来的,这里贴一下(大家不用看)version:'3'services:mongo:image:mongo:4.2networks:-graylogelasticsearch:图片:码头工人。elastic.co/elasticsearch/elasticsearch-oss:7.10.2环境:-http.host=0.0.0.0-transport.host=localhost-network.host=0.0.0.0-"ES_JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true-Xms512m-Xmx512m"ulimits:memlock:soft:-1hard:-1deploy:resources:limits:memory:1gnetworks:-grayloggraylog:image:graylog/graylog:4.2environment:-GRAYLOG_PASSWORD_SECRET=somepasswordpepper-GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918-GRAYLOG_HTTP_EXTERNAL_URI=http://ip:9009/#这里注意更改ip入口点:/usr/bin/tini--wait-for-itelasticsearch:9200--/docker-entrypoint.shnetworks:-graylogrestart:alwaysdepends_on:-mongo-elasticsearchports:-9009:9000-1514:1514-1514:1514/udp-12201:12201-12201:12201/udpnetworks:graylog:driver:bridge仅需要此文件改的就是ip(原来的端口是9000,我已经占用了9000端口,所以我这里把端口改成9009,大家放心)好了,写好docker-compose.yml文件后,直接docker-composeup-d它启动了。启动后,我们可以通过ip:port访问对应的Graylog后台地址。默认帐号和密码为admin/admin。然后,我们配置inputs的配置,找到GELFUDP,点击Launchnewinput,Title字段只需要填写,保存就大功告成(其他不用动)。好了,到这里,我们的GrayLog设置就完成了。03.SpringBoot使用GrayLog。还记得我们austin项目使用的日志框架吗?没错,就是logback。我们将日志数据写入Graylog是非常简单的。只需要两步:1.引入依赖:de.siegmarlogback-gelf3.0.02.在logback.xml中配置graylog相关信息:ip12201508truefalsetruetruefalsefalsetrue%m%nopex%d-[%thread]%-5level%logger{35}-%msg%napp_name:austin在这个配置信息中,唯一需要改变的就是ip地址,到这里就完成了访问,我们可以看到log信息再次打开控制台。04、稍微了解一下GrayLog,稍微了解一下GrayLog的查询语法:其实我日常出入就用到这几个。让我告诉你我通常使用的东西。如果觉得不够,去官网拿一份:https://docs.graylog.org/docs/query-language1.根据字段精确查询:full_message:"13788888888"2.查询错误loginformation:level_name:"ERROR"3.组合多字段查询:level_name:"INFO"ANDfull_message:"13788888888"访问的时候细心的朋友可能会发现我输入的时候选择的是GELF,然后引入Maven依赖的时候,有还有GELF这个词。GELF是什么意思?这篇在官网也给出了相应的解释:TheGraylogExtendedLogFormat(GELF)是一种避免了经典plainsyslog缺点的日志格式详情:https://docs.graylog.org/docs/gelfGELF是一个log格式可以避免传统意义上的syslogs的一些问题,而我们引入的Maven依赖是将log格式化成GELF格式,附加到GrayLog中。05.番外:Swagger前几天GitHub上有个老哥给我发了一个关于swagger的pullrequest。昨天合并了他,升级了swagger版本。之前没有用过类似swagger的文档工具,所以这次pullrequest也尝试了swagger。初体验感觉不错:可以在一个页面管理项目所有接口的文档信息,可以直接通过sample参数发送请求。文档通过注解编写,再也不用担心改代码忘记更新文档了。不过后来自己配置了相应的参数信息文档,然后在swagger-ui中体验了一下,发现确实很丑。看到这个ui,我应该分阶段放弃了。swagger有好几个竞品,我觉得ui好像比swagger好。但是,austin项目只有一个主界面。作为一个熟练的markdown工程师,我可以轻松搞定文档工作,所以没有继续体验其他竞品。06.总结之前,在知乎上好像看到过类似的一段话:一个好的工具或者框架,取决于上手的难易程度。如果一个框架需要很长时间才能弄清楚,它可能做得不好。其实我不经常去研究所使用的各种框架的细节和原理,也不会蒙头看源码。没必要,毕竟也没有什么不好的。对于GrayLog这样的工具框架,如果你不是公司的主要维护者,也无需过多纠结于它的实现细节,大体掌握其设计思路即可。相反,我建议如果你真的想学,你得看它的具体存储(比如Elasticsearch的原理)。学习一定有好处(学习可以提高效率,学习可以以后面试吹牛加工资,学了可以让自己开心,学了可以装酷)这个我看过,so竖起大拇指也不过分吧?我3岁了,下次见。关注我的微信公众号【Java3y】除了技术也可以聊聊日常生活,有些话只能小声说~【在线面试官+从零开始写Java项目】持续高强度更新!求一星!!原创不易!!一连求三!!Austin项目源码Gitee链接:gitee.com/austinaustin项目源码GitHub链接:github.com/austin