分布式日志框架服务的实现思路基本是一致的,如下:

  • 日志收集器:微服务中引入日志客户端,将记录的日志发送到日志服务端的收集器,然后以某种方式存储
  • 数据存储:一般使用ElasticSearch分布式存储,把收集器收集到的日志格式化,然后存储到分布式存储中
  • web服务:利用ElasticSearch的统计搜索功能,实现日志查询和报表输出

比较知名的分布式日志服务包括:

  • ELK:elasticsearch、Logstash、Kibana
  • GrayLog

1.为什么选择GrayLog?

在业界,ELK(Elasticsearch、Logstash、Kibana)是一套备受欢迎的分布式日志服务解决方案。然而,随着对日志分析需求的不断演变,GrayLog崭露头角,成为备受关注的后起之秀。接下来,我们将对ELK和GrayLog进行比较,探讨它们的优势和劣势。

ELK的问题

  • 多行日志处理不足: ELK无法很好地处理多行日志,例如Mysql慢查询或Tomcat/Jetty应用的Java异常打印。
  • 原始日志保存不足: ELK无法保留原始日志,只能将其分字段保存,导致搜索结果呈现为一堆Json格式文本,难以阅读。
  • 不匹配正则表达式的日志行丢失: ELK对于不符合正则表达式匹配的日志行,会被全部丢弃。

GrayLog的优势

  • 一体化方案: GrayLog是一体化方案,安装方便,无需解决ELK中3个独立系统间的集成问题。
  • 采集原始日志: GrayLog能够采集原始日志,并可以事后再添加字段,例如http_status_coderesponse_time等。
  • 自定义日志采集脚本: GrayLog允许开发者自行开发日志采集脚本,并使用curl/nc将其发送到Graylog Server。这些脚本可以使用自定义的GELF(Graylog Extended Log Format),而Fluentd和Logstash也提供了相应的输出GELF消息的插件。实际上,只需使用inotifywait监控日志的modify事件,并使用curl/netcat将新增行发送到Graylog Server即可。
  • 搜索结果高亮显示: GrayLog的搜索结果能够高亮显示,类似于Google搜索。
  • 简单搜索语法: GrayLog的搜索语法简单易懂,例如:source:mongo AND response_time_ms:>5000,避免直接输入Elasticsearch搜索JSON语法。
  • 导出搜索条件为Elasticsearch JSON文本: GrayLog允许用户将搜索条件导出为Elasticsearch的搜索JSON文本,方便直接开发调用Elasticsearch REST API的搜索脚本。

在这场ELK与GrayLog的较量中,GrayLog凭借其更灵活的原始日志处理和一体化方案,为用户提供了更多的自由度和便利性。随着日志分析领域的不断发展,GrayLog正崭露头角,成为日志管理的新选择。

2.GrayLog简介

GrayLog是一个轻量型的分布式日志管理平台,一个开源的日志聚合、分析、审计、展示和预警工具。在功能上来说,和 ELK类似,但又比 ELK要简单轻量许多。依靠着更加简洁,高效,部署使用简单的优势很快受到许多公司的青睐。

官网:https://www.graylog.org/其基本框架如图:

Graylog分布式日志收集_服务端

流程如下

  • 微服务中的GrayLog客户端发送日志到GrayLog服务端
  • GrayLog把日志信息格式化,存储到Elasticsearch
  • 客户端通过浏览器访问GrayLog,GrayLog访问Elasticsearch

MongoDB是用来存储GrayLog的配置信息的,这样搭建集群时,GrayLog的各节点可以共享配置

3. 部署安装

我们在虚拟机中选择使用Docker来安装。需要安装的包括:

  • MongoDB:用来存储GrayLog的配置信息
  • Elasticsearch:用来存储日志信息
  • GrayLog:GrayLog服务端

下面将通过docker的方式部署:

3.1 文件准备和Elasticsearch安装

  • 配置文件夹用于存储数据
mkdir -p /mydata/es-data  /mydata/es-plugins /mydata/mongodb

注意要给chmod 777 /mydata/es-data设置权限

chmod 777 /mydata/es-data
  • 安装部署Elasticsearch
#部署Elasticsearch
docker run -d \
    --name elasticsearch \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v /mydata/es-data:/usr/share/elasticsearch/data \
    -v /mydata/es-plugins:/usr/share/elasticsearch/plugins \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.17.5

3.3 部署MongoDB

docker run -d \
--name mongodb \
-p 27017:27017 \
--restart=always \
-v /mydata/mongodb:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=zbbmeta \
-e MONGO_INITDB_ROOT_PASSWORD=123321 \
mongo:4.4

3.3 部署graylog

docker run \
--name graylog \
-p 9000:9000 \
-p 12201:12201/udp \
-e GRAYLOG_HTTP_EXTERNAL_URI=http://192.168.150.102:9000/ \
-e GRAYLOG_ELASTICSEARCH_HOSTS=http://192.168.150.102:9200/ \
-e GRAYLOG_ROOT_TIMEZONE="Asia/Shanghai"  \
-e GRAYLOG_WEB_ENDPOINT_URI="http://192.168.150.102:9000/:9000/api" \
-e GRAYLOG_PASSWORD_SECRET="somepasswordpepper" \
-e GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 \
-e GRAYLOG_MONGODB_URI=mongodb://zbbmeta:123321@192.168.150.102:27017/admin \
-d \
graylog/graylog:4.3

命令解读:

  • 端口信息:
  • -p 9000:9000:GrayLog的http服务端口,9000
  • -p 12201:12201/udp:GrayLog的GELF UDP协议端口,用于接收从微服务发来的日志信息
  • 环境变量
  • -e GRAYLOG_HTTP_EXTERNAL_URI:对外开放的ip和端口信息,这里用9000端口
  • -e GRAYLOG_ELASTICSEARCH_HOSTS:GrayLog依赖于ES,这里指定ES的地址
  • -e GRAYLOG_WEB_ENDPOINT_URI:对外开放的API地址
  • -e GRAYLOG_ROOT_PASSWORD_SHA2:密码加密后的密文。明文是admin,账户也是admin
  • -e GRAYLOG_ROOT_TIMEZONE="Asia/Shanghai":GrayLog容器内时区
  • -e GRAYLOG_MONGODB_URI:指定MongoDB的链接信息

GRAYLOG_ROOT_PASSWORD_SHA2可以使用以下命令进行生成

echo -n "Enter Password: " && head -1 < /dev/stdin | tr -d '\n' | sha256sum | cut -d " " -f1

访问地址 http://192.168.150.102:9000/ , 如果可以看到如下界面说明启动成功。

Graylog分布式日志收集_Elastic_02

通过 admin/admin登录,即可看到欢迎页面,目前还没有数据:

4. 日志收集

4.1. 配置Inputs

部署完成GrayLog后,需要配置Inputs才能接收微服务发来的日志数据。

  • 第一步,在System菜单中选择Inputs

Graylog分布式日志收集_Elastic_03

  • 第二步,在页面的下拉选框中,选择GELF UDP

Graylog分布式日志收集_服务端_04

  • 点击Launch new input按钮:

Graylog分布式日志收集_搜索_05


  • 点击save保存:
  • Graylog分布式日志收集_Elastic_06

Graylog分布式日志收集_搜索_07

可以看到,GELF UDP Inputs 保存成功。

5. 集成微服务

现在,GrayLog的服务端日志收集器已经准备好,我们还需要在项目中添加GrayLog的客户端,将项目日志发送到GrayLog服务中,保存到ElasticSearch 基本步骤如下:

  • 引入GrayLog客户端依赖
  • 配置Logback,集成GrayLog的Appender
  • 启动并测试

这里代码还是要之前项目代码

# 代码地址
https://github.com/bangbangzhou/spring-boot-event-log-demo.git

Graylog分布式日志收集_Elastic_08

在spring-boot-event-log-demo项目中添加依赖

<dependency>
    <groupId>biz.paluch.logging</groupId>
    <artifactId>logstash-gelf</artifactId>
    <version>1.15.0</version>
</dependency>
  • 在logback-base.xml,在配置文件中增加 GELF的appender
<appender name="GELF" class="biz.paluch.logging.gelf.logback.GelfLogbackAppender">
        <!--GrayLog服务地址-->
        <host>udp:192.168.150.102</host>
        <!--GrayLog服务端口-->
        <port>12201</port>
        <version>1.1</version>
        <!--当前服务名称-->
        <facility>event-log-demo</facility>
        <extractStackTrace>true</extractStackTrace>
        <filterStackTrace>true</filterStackTrace>
        <mdcProfiling>true</mdcProfiling>
        <timestampPattern>yyyy-MM-dd HH:mm:ss,SSS</timestampPattern>
        <maximumMessageSize>8192</maximumMessageSize>
    </appender>
  • logback-spring.xml配置文件中添加配置
<!--
    root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
    level:设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF 默认是DEBUG
    可以包含零个或多个元素,标识这个appender将会添加到这个logger。
    -->
    <root level="info">
        <appender-ref ref="LOG_CONSOLE" />
        <appender-ref ref="LOG_FILE" />
<!--        <appender-ref ref="LOGSTASH" />-->
        <appender-ref ref="GELF"/>
    </root>
  • 启动项目,使用postman发送请求http://localhost:8890/user/name?name=12343,点击search按钮即可看到日志数据:

Graylog分布式日志收集_搜索_09