Graylog和ELK的简单对比

本文探讨了ELK(Elasticsearch+Logstash+Kibana)与Graylog在日志收集、解析和可视化的对比,包括各自的优势(如ELK的灵活性与检索性能,Graylog的一体化和原始日志处理)及不足(如ELK的多行日志处理和原始日志保存问题,Graylog的英文界面)。

一、常用日志平台

日志管理工具的作用:收集,解析,可视化

常用的日志平台:ELK(Elasticsearch+Logstash +Kibana )
Elasticsearch:一个基于Lucene的文档存储,主要用于日志索引、存储和分析。
Logstash:管理事件和日志的工具
Kibana:可视化日志和时间戳数据

其他日志组件:
Fluentd:日志收集和发出
Flume:分布式日志收集和聚合系统
Heka:流处理系统,可用于日志聚合
Octopussy:日志管理解决方案(可视化/报警/报告)

本次要和ELK对比的日志平台:
Graylog:具有报警选项的可插入日志和事件分析服务器,Graylog开源版官网: https://www.graylog.org/

二、Graylog与ELK方案的对比

1、组件

ELK:Elasticsearch + Logstash + Kibana
Graylog:Elasticsearch + Graylog Server + Graylog Web

2、ELK优缺

2.1、ELK优点

1、处理方式灵活:elasticsearch是实时全文索引,具有强大的搜索功能
2、配置相对简单:elasticsearch全部使用JSON 接口,logstash使用模块配置,kibana的配置文件部分更简单。
3、检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。
4、集群线性扩展:elasticsearch和logstash都可以灵活线性扩展
5、前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单

2.2、ELK缺点

1、不能处理多行日志,比如Mysql慢查询,Tomcat/Jetty应用的Java异常打印
2、不能保留原始日志,只能把原始日志分字段保存,这样搜索日志结果是一堆Json格式文本,无法阅读。
3、不复合正则表达式匹配的日志行,被全部丢弃。

3、Graylog优缺

3.1、Graylog优点

1、一体化方案,安装方便,不像ELK有3个独立系统间的集成问题。
2、采集原始日志,并可以事后再添加字段,比如http_status_code,response_time等等。
3、自己开发采集日志的脚本,并用curl/nc发送到Graylog Server,发送格式是自定义的GELF,Flunted和Logstash都有相应的输出GELF消息的插件。自己开发带来很大的自由度。实际上只需要用inotify_wait监控日志的MODIFY事件,并把日志的新增行用curl/nc发送到Graylog Server就可。
4、搜索结果高亮显示,就像google一样。
5、搜索语法简单,比如: source:mongo AND reponse_time_ms:>5000 ,避免直接输入elasticsearch搜索json语法
6、搜索条件可以导出为elasticsearch的搜索json文本,方便直接开发调用elasticsearch rest api的搜索脚本。

3.2、Graylog缺点

1、控制台操作页面是英文的,针对国内开发使用者使用起来不方便,还得额外汉化,汉化可能失败
2、使用网络传输,可能会占用项目网络

## 什么是graylog Graylog 是一个简单易用、功能较全面的日志管理工具,相比 ELK 组合, 优点: - 部署维护简单 - 查询语法简单易懂(对比ES的语法…) - 内置简单的告警 - 可以将搜索结果导出为 json - 提供简单的聚合统计功能 - UI 比较友好 - 当然, 拓展性上比 ELK 差很多。 整套依赖: - Graylog 提供 graylog 对外接口 - Elasticsearch 日志文件的持久化存储检索 - MongoDB 只是存储一些 Graylog 的配置 ## 安装 > 可以是裸机安装,也可以是docker安装,这里用docker安装 环境要求: - centos7.4 - cpu2个 内存2G 参考: https://hub.docker.com/r/graylog2/graylog/ ### 环境准备 ``` mkdir /root/graylog && cd /root/graylog //挂载目录 mkdir -p mongo_data graylog_journal es_data //配置文件目录 mkdir -p ./graylog/config cd ./graylog/config wget https://raw.githubusercontent.com/Graylog2/graylog-docker/3.0/config/graylog.conf wget https://raw.githubusercontent.com/Graylog2/graylog-docker/3.0/config/log4j2.xml //提前准备镜像 docker pull mongo:3 docker pull graylog/graylog:3.0 docker pull elasticsearch:5.6.9 ``` ### docker-compose.yml ``` version: '2' services: # MongoDB: https://hub.docker.com/_/mongo/ mongo: image: mongo:3 volumes: - ./mongo_data:/data/db - /etc/localtime:/etc/localtime # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/docker.html elasticsearch: image: elasticsearch:5.6.9 volumes: - ./es_data:/usr/share/elasticsearch/data - /etc/localtime:/etc/localtime environment: - http.host=0.0.0.0 - transport.host=localhost - network.host=0.0.0.0 # Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/security-settings.html#general-security-settings - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 mem_limit: 1g # Graylog: https://hub.docker.com/r/graylog/graylog/ graylog: image: graylog/graylog:3.0 volumes: - ./graylog_journal:/usr/share/graylog/data/journal - ./graylog/config:/usr/share/graylog/data/config - /etc/localtime:/etc/localtime environment: # CHANGE ME! - GRAYLOG_PASSWORD_SECRET=somepasswordpepper # Password: admin - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 # 这里需要修改为要暴露的机器的地址 - GRAYLOG_HTTP_EXTERNAL_URI=http://10.121.60.2:9000/ links: - mongo - elasticsearch ports: # Graylog web interface and REST API - 9000:9000 # Syslog TCP - 514:514 # Syslog UDP - 514:514/udp # GELF TCP - 12201:12201 # GELF UDP - 12201:12201/udp # GELF HTTP - 12202:12202 ``` ### 启动 `docker-compose -f docker-compose.yml up -d` 通过http://10.121.60.2:9000/访问web,admin/admin ### 修改配置 - email相关(告警需要) ``` transport_email_enabled = true transport_email_hostname = smtp.163.com transport_email_port = 994 transport_email_use_auth = true transport_email_use_tls = true transport_email_use_ssl = true transport_email_auth_username = 17191093767@163.com transport_email_auth_password = zhim123456 transport_email_subject_prefix = [graylog] transport_email_from_email = 17191093767@163.com transport_email_web_interface_url = http://10.121.60.2:9000 ``` ## 使用 ### 配置添加Inputs > Graylog 节点能够接受数据的类型称之为input,常见的有GELF TCP, GELF UDP, GELF HTTP. 说明:GELF TCP, GELF UDP可以使用同一个端口,HTTP需要另起端口,原因不解释。 - 添加三个input,过程略,tcp,udp端口使用默认的12201,http端口使用12202。 - 验证 ``` // udp echo -n '{ "version": "1.1", "host": "example.org", "short_message": "A short message info with udp", "level": 1, "_some_info": "foo", "_tag": "test11" }' | nc -w10 -u 10.121.60.2 12201 // tcp echo -n -e '{ "version": "1.1", "host": "example.org", "short_message": "A short message with tcp", "level": 1, "_some_info": "foo" }'"\0" | nc -w10 10.121.60.2 12201 //http curl -X POST -H 'Content-Type: application/json' -d '{ "version": "1.1", "host": "example.org", "short_message": "A short message with http", "level": 5, "_some_info": "foo" }' 'http://10.121.60.2:12202/gelf' ``` ### docker 日志添加到graylog ``` docker run --log-driver=gelf \ --log-opt gelf-address=udp://10.121.60.2:12201 \ --log-opt tag=test1 \ -v /etc/localtime:/etc/localtime \ -it nginx /bin/bash ``` docker-compose.yaml ``` services: mongo: logging: driver: "gelf" options: gelf-address: "udp://10.121.60.2:12201" tag: mongo volumes: - /etc/localtime:/etc/localtime ``` ### java日志直接发送到graylog > 使用logback ``` 10.121.60.2 12201 <!--An example of overwriting the short message pattern--> %ex{short}%.100m <!-- Use HTML output of the full message. Yes, any layout can be used (please don't actually do this)--> %d{MM-dd HH:mm:ss.SSS} [%thread] %-5level \(%F:%L\) - %msg %n true true true true requestId:long <!--Facility is not officially supported in GELF anymore, but you can use staticFields to do the same thing--> tag business-server ``` ## 系统使用 功能菜单说明 - search 日志查询面板 ![](assets/2018-07-10-11-52-07.png) - streams 将日志对象按照filed定义为stream,默认的stream为all messages ![](assets/2018-07-10-11-52-22.png) - alerts 告警相关,选择一个stream对象定义告警条件通知方式,当stream里面的日志满足条件时候告警并通知 ![](assets/2018-07-10-11-52-35.png) - dashboards 图形面板 ![](assets/2018-07-10-11-52-53.png) - source 告警所在主机 ![](assets/2018-07-10-11-53-37.png) - system 系统配置 ![](assets/2018-07-10-11-53-52.png) ### 查询条件 [官方说明文档](http://docs.graylog.org/en/3.0/pages/queries.html) > 关键字不分大小写 - 单个关键字查询 `ssh` - 多关键字查询,含有ssh or login `ssh login` - 含有某个字符串查询 `ssh login` - 同时含有多个关键字查询 `opening index" AND db` - 根据字段值查询 `tag:couchdb.peer0.org1.ygsoft.com` - 含有多个tag的查询,某条记录只要其中一个字段满足即可 ``` tag: (orderer.ygsoft.com couchdb.peer0.org1.ygsoft.com) or tag: orderer.ygsoft.com couchdb.peer0.org1.ygsoft.com ``` - 含有完全匹配字段 `tag:"ssh login"` - 含有某个字段的记录: `_exists_:tag` - 不含有某个字段的记录: `NOT _exists_:tag` - AND OR `"ssh login" AND source:example.org` `("ssh login" AND (source:example.org OR source:another.example.org)) OR _exists_:always_find_me` - NOT ``` "ssh login" AND NOT source:example.org NOT example.org ``` 注意: AND, OR, and NOT 只能大写. - 通配符 ? 表示单个字符 星号表示0个多个字符 ``` source:*.org source:exam?le.org source:exam?le.* ``` 注意:默认首字母不能使用通配符,因为这样会使用大量的内存;强行开启修改配置文件`allow_leading_wildcard_searches = true` - 当某关键字不确认顺序的时候使用~ ``` ssh logni~ source:exmaple.org~ 结果可以匹配 ssh login and example.org ``` - 以下字符在使用的时候必须用反斜杠转义 ``` && || : \ / + - ! ( ) { } [ ] ^ " ~ * ? Example: resource:\/posts\/45326 ``` ### 查询条件可以保存下来 使用 save search criteria 按钮
<think>好的,用户想比较GraylogELK的关系,可能是功能差异、集成可能性或者应用场景的对比。首先,我需要回顾之前提供的引用内容,确保准确提取关键点。 根据引用[2],GraylogELK的主要区别在于定位:Graylog是专门的日志解决方案,而ELK是大数据解决方案。Graylog可以直接接收结构化日志syslog,而ELK需要Logstash处理纯文本日志。这点很重要,需要强调两者的核心定位不同,影响它们的应用场景。 接着,用户可能关心部署维护的难易程度。引用[2][4]提到Graylog部署更简单,开箱即用,权限系统更好,而ELK需要多个组件协作,部署时间更长。这时候需要比较两者的架构差异,比如Graylog集成ElasticsearchMongoDB,而ELK包括Elasticsearch、Logstash、Kibana,可能还有Beats。 功能方面,引用[1][2]指出Graylog有内置的警报、报告权限系统,而ELK需要额外配置,比如用X-Pack来实现安全功能。用户可能想知道在功能上哪个更全面或更易用。 集成可能性方面,引用[3][4]提到Graylog可以用Elasticsearch作为存储,可能ELK的组件有交集。但通常两者是替代关系,不过如果有特殊需求,可能可以部分集成,比如Graylog用Elasticsearch存储,同时使用Kibana做可视化,但需要确认兼容性。 应用场景方面,Graylog适合需要快速部署、简单日志管理的场景,特别是中小规模;而ELK适合大数据处理,需要灵活定制扩展的环境。用户可能想知道在不同规模或需求下如何选择。 还需要注意用户可能的隐藏需求,比如他们是否已经在使用其中一个,或者是否有特定的日志类型(如结构化vs非结构化)。此外,是否需要权限管理、警报功能等高级特性也是决策因素。 最后,要确保回答结构清晰,分点对比,引用相关的引用来源,并生成相关问题帮助用户进一步探索。</think>### GraylogELK的功能对比及关系解析 #### 一、核心定位差异 1. **Graylog** - 专为**日志管理**设计的集成化解决方案,核心功能覆盖日志收集、存储、分析、告警全链路[^2][^4] - 直接支持结构化日志标准syslog协议输入,无需额外解析[^2] - 架构包含Graylog Server(数据处理)、Elasticsearch(存储)、MongoDB(配置管理)[^4] 2. **ELK Stack** - 基于Elasticsearch的**大数据分析平台**,适用于日志、指标、业务数据等多种场景[^2] - 依赖Logstash进行日志解析格式化(需手动配置解析规则)[^2] - 组件包含Elasticsearch(存储)、Logstash/Kafka(数据管道)、Kibana(可视化)[^4] #### 二、功能特性对比 | 特性 | Graylog | ELK Stack | |---------------------|----------------------------------|--------------------------------| | **部署复杂度** | 单应用集成,15分钟完成基础部署[^4] | 需独立部署3+组件,调试成本高[^2] | | **权限管理** | 内置RBAC权限系统,支持LDAP集成[^4] | 依赖X-Pack扩展,需额外付费[^2] | | **日志协议支持** | 原生支持Syslog、GELF、HTTP等[^4] | 需通过Logstash插件扩展协议支持 | | **告警功能** | 内置阈值告警通知渠道[^1] | 需通过ElastAlert或Watcher实现 | | **存储扩展性** | 依赖Elasticsearch集群扩展[^3] | 原生支持Elasticsearch分布式架构 | | **查询语法** | 类自然语言搜索(易用性高)[^4] | 需掌握Elasticsearch DSL语法 | #### 三、集成可能性 1. **组件复用** - Graylog可直接使用Elasticsearch作为存储后端[^3][^4],但**不建议ELK共用集群**,因索引管理策略不同易导致冲突 - 可通过Sidecar模式将Filebeat同时指向GraylogLogstash,实现双链路日志分发 2. **数据交互** ```mermaid graph LR A[微服务] -->|GELF/Syslog| B(Graylog Server) A -->|Filebeat| C(Logstash) B --> D[Elasticsearch] C --> D D --> E{Kibana} D --> F{Graylog Web} ``` #### 四、典型应用场景 - **选择Graylog** ✅ 快速搭建日志监控系统(如中小型SaaS平台) ✅ 需要开箱即用的权限控制告警功能[^1] ✅ 处理结构化日志(如Kubernetes容器日志) - **选择ELK** ✅ 非结构化日志的深度解析(如原始文本日志) ✅ 超大规模数据场景(PB级日志存储) ✅ 需要业务指标分析结合的复杂场景 #### 五、演进趋势 Graylog 4.0开始强化机器学习能力,ELK 8.x增加OpenTelemetry支持,两者在可观测性领域功能重叠度逐渐增加,但**核心差异仍在于:** - Graylog:**垂直领域深度优化**(日志全生命周期管理) - ELK:**水平扩展能力**(通用大数据分析)[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值