深入探究分布式日志系统 Graylog:架构、部署与优化

文章目录

一、Graylog简介

Graylog是一个简单易用、功能较全面的日志管理工具,Graylog也采用Elasticsearch作为存储和索引以保障性能,MongoDB用来存储少量的自身配置信息,master-node模式具有很好的扩展性,UI上自带的基础查询与分析功能比较实用且高效,支持LDAP、权限控制并有丰富的日志类型和标准(如syslog,GELF)并支持基于日志的报警。

在日志接收方面通常是网络传输,可以是TCP也可以是UDP,在实际生产环境量级较大多数采用UDP,也可以通过MQ来消费日志。

Graylog的优势

  • 部署维护简单
  • 资源占用较少
  • 查询语法简单易懂(对比ES的语法...)
  • 内置简单的告警
  • 可以将搜索结果导出为 json
  • UI 比较友好

二、Graylog原理架构

Graylog 最简单的架构就是单机部署,复杂的也是部署集群模式,架构图示如下所示。我们可以看到其中包含了三个组件,分别是 Elasticsearch、MongoDb 和 Graylog。

其中,Elasticsearch 用来持久化存储和检索日志文件数据(IO 密集),MongoDb 用来存储关于 Graylog 的相关配置信息,而 Graylog 来提供 Web 界面和对外接口(CPU 密集)。

单机版本

集群版本

数据处理流程

日志消息通过各种Input输入到Graylog中进行处理;

可以通过Extractors进行正则、Json等形式解析;

通过Streams进行规则匹配分流,对Stream可以配置Pipeline进行数据过滤,最终数据会到到不同的index中;

根据新建index时配置的策略,在elasticsearch的索引中;

告警(Alert)基于Stream进行设置。

为了让大家能够对graylog有一个完整的认识做了一个思维导图。

可以看出graylog的设计是非常全面的,从日志的采集、数据分类管理、数据清洗、调用第三方API都考虑到了。

组件名称 功能介绍 主要特点
Dashboards 数据面板固定展示 主要是用来保存特定搜索条件的数据面板
Search 日志信息条件搜索 关键字搜索、时间搜索、搜索保存、创建面板、分组查询、结果导出、查询高亮显示、自定义时间
Alerts 设置告警提示方式 支持邮件告警、HTTP回调和自定义脚本触发
Inputs 日志数据抓取接收 部署 Sidercar 主动抓取或使用其他服务被动上报
Extractors 日志数据格式转换 json 解析、k-v 解析、时间戳解析、正则解析
Streams 日志信息分类分组 设置日志分类条件并发送到不同的索引文件中去
Indices 持久化数据存储 设置数据存储性能
Outputs 日志数据的转发 解析的 Stream 发送到其他 Graylog 集群或服务
Pipelines 日志数据的过滤 建立数据清洗的过滤规则、字段添加删除、条件过滤、自定义函数等
Sidecar 轻量级的日志采集器 相当于 C/S 模式;大规模时使用
Lookup Tables 服务解析 基于 IP 的 Whois 查询和基于来源 IP 的情报监控
Geolocation 可视化地理位置 实现基于来源 IP 的情报监控

三、日志系统对比

对比 ELK Graylog
组件 ES+Logstash+Kibana ES+GraylogServer+GarylogWeb
优点 1、处理方式灵活:elasticsearch是实时全文索引,具有强大的搜索功能 2、配置相对简单:elasticsearch全部使用JSON 接口,logstash使用模块配置,kibana的配置文件部分更简单。 3、检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。 4、集群线性扩展:elasticsearch和logstash都可以灵活线性扩展 5、前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单 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的搜索脚本。
缺点 1、不能处理多行日志,比如Mysql慢查询,Tomcat/Jetty应用的Java异常打印 2、不能保留原始日志,只能把原始日志分字段保存,这样搜索日志结果是一堆Json格式文本,无法阅读。 3、不复合正则表达式匹配的日志行,被全部丢弃。 1、控制台操作页面是英文的,针对国内开发使用者使用起来不方便,还得额外汉化,汉化可能失败 2、使用网络传输,可能会占用项目网络

总结:

两者之间最重要的区别在于,从一开始,Graylog就定位为强大的日志解决方案,而ELK则是大数据解决方案。Graylog可以通过网络协议直接从应用程序接收结构化日志和标准syslog。相反,ELK是使用Logstash分析已收集的纯文本日志的解决方案,然后解析并将它们传递给ElasticSearch。在ELK中,Kibana扮演仪表盘的角色并显示从Logstash收到的数据。Graylog在这点上更方便,因为它提供了单一应用程序解决方案(不包括ElasticSearch作为灵活的数据存储),具有几乎相同的功能。因此,部署所需的时间更短。此外,与ELK相比,Graylog开箱即用,且具有出色的权限系统,而Kibana则不具备此功能,Graylog具有直观的GUI,并提供警报、报告和自定义分析功能。最重要的是,它能在多个日志源和跨机房收集数TB的数据。

四、Graylog部署

各组件文件系统默认路径:

传统部署

Graylog 5.0 需要以下内容来保持与其软件依赖项的兼容性:

OpenJDK 17(嵌入在5.0安装文件中)

Elasticsearch 7.10.2或OpenSearch 2.x

MongoDB(5.x 或 6.x)

MongoDB部署

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.14.tgz

tar -xf mongodb-linux-x86_64-rhel70-5.0.14.tgz 
mv mongodb-linux-x86_64-rhel70-5.0.14 /usr/local/mongodb
mkdir -p single/logs
mkdir -p single/data/db
vim /etc/profile (添加)
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
​
source /etc/profile
​
vi /etc/mongodb.conf
#指定数据库路径
dbpath=/root/graylog/single/data
#指定MongoDB日志文件
logpath=/root/graylog/single/logs/mongodb.log
# 使用追加的方式写日志
logappend=true
#端口号
port=27017 
#方便外网访问
bind_ip=0.0.0.0
fork=true # 以守护进程的方式运行MongoDB,创建服务器进程
#auth=true #启用用户验证
#bind_ip=0.0.0.0 #绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定则默认本地所有IP

mongod  -f /etc/mongodb.conf #启动mongodb

OS或者ES部署

rpm --import https://artifacts.opensearch.org/publickeys/opensearch.pgp 
#安装OS GPG密钥
wget https://artifacts.opensearch.org/releases/bundle/opensearch/2.4.1/opensearch-2.4.1-linux-x64.tar.gz
tar -xf opensearch-2.4.1-linux-x64.tar.gz
chown -R os:os opensearch-2.4.1/
cd opensearch-2.4.1/
su os (和es一样,root启动会报错)
./opensearch-tar-install.sh 
​

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch  
#安装 ES GPG 密钥
vim  /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-7.10.2]
name=Elasticsearch repository for 7.10.2 packages
baseurl=https://artifacts.elastic.co/packages/oss-7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

yum install elasticsearch-oss
sudo tee -a /etc/elasticsearch/elasticsearch.yml > /dev/null <<EOT
cluster.name: graylog
action.auto_create_index: false
EOT
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl restart elasticsearch.service
sudo systemctl --type=service --state=active
grep elasticsearch

Garylog部署

rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-5.0-repository_latest.rpm
yum install graylog-server
阅读配置文件中的说明并根据需要进行编辑,位于/etc/graylog/server/server.conf. 另外添加password_secret和root_password_sha2因为这些是强制性的,没有它们 Graylog 将无法启动。
​
要创建您的root_password_sha2运行以下命令:
echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
为了能够连接到 Graylog,您应该设置http_bind_address您可以连接到的机器的公共主机名或公共 IP 地址。
​
sudo systemctl daemon-reload
sudo systemctl enable graylog-server.service
sudo systemctl start graylog-server.service
sudo systemctl --type=service --state=active | grep graylog
​

容器化部署

docker-compose.yaml

version: '2'
services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    container_name: mongo
    image: mongo:5
    volumes:
      - mongo_data:/data/db
  # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/docker.html
  elasticsearch:
    container_name: es
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
    volumes:
      - es_data:/usr/share/elasticsearch/data
    environment:
      - TZ=Asia/Shanghai
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 4g
  # Graylog: https://hub.docker.com/r/graylog/graylog/
  graylog:
    container_name: graylog
    image: graylog/graylog:
    environment:
      - http_bind_address = 0.0.0.0:9000  
      # CHANGE ME (must be at least 16 characters)!
      - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
      - GRAYLOG_ROOT_USERNAME=admin
      # Password: admin
      - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
      - GRAYLOG_HTTP_EXTERNAL_URI=http://192.168.3.83:9000/ #这里配置公网访问地址,可注释.
      - TZ=Asia/Shanghai
    links:
      - mongodb:mongo
      - elasticsearch
    depends_on:
      - mongodb
      - elasticsearch
    ports:
      # Graylog web interface and REST API
      - 9000:9000
      # Syslog TCP
      - 1514:1514
      # Syslog UDP
      - 1514:1514/udp
      # GELF TCP
      - 12201:12201
      # GELF UDP
      - 12201-12205:12201-12205/udp
# Volumes for persisting data, see https://docs.docker.com/engine/admin/volumes/volumes/
volumes:
  mongo_data:
    driver: local
  es_data:
    driver: local
  graylog_journal:
    driver: local

docker-compose up #启动 graylog 服务

docker-compose down #停止服务并删除容器

graylog 启动后,可以通过ip端口访问 ,如:http://192.168.11.127:9000

至此 graylog 环境以及搭建完毕!!

五、配置详情

• is_master = true
o 如果您正在运行多个Graylog服务器实例,则只需选择一个graylog-server节点作为主节点。该节点将执行从属节点不会执行的定期和维护操作。
o 每个从属节点都将像主节点一样接受消息。如果集群中已存在主节点,则节点将退回到从属模式。
• node_id_file = /etc/graylog/server/
o 自动生成的节点ID将存储在此文件中,并在重新启动后读取。如果要从初始化脚本或类似脚本启动Graylog服务器,则在此处使用绝对文件路径是个好主意。
• password_secret =
o 您必须设置一个用于密码加密和加密的秘密。如果未设置,服务器将拒绝启动。至少使用64个字符。如果您运行多个graylog-server节点,请确保password_secret对所有节点都使用相同的节点!
注意
例如产生秘密 pwgen -N 1 -s 96
• root_username = admin
o 默认的root用户名为admin。
• root_password_sha2 =
o 您将用于首次登录的密码的SHA2哈希。将此设置为生成的SHA2哈希,您将能够使用用户名admin和密码yourpassword登录Web界面。echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
警告
您必须为根用户指定一个哈希密码(您只需要在初始设置系统时使用,以防丢失与身份验证后端的连接)。不能使用API或通过Web界面更改此密码。如果需要更改,请在此文件中对其进行修改。
• root_email = ""
o 根用户的电子邮件地址。默认为空。
• root_timezone = UTC
o root用户的时区设置。请参阅此有效时区列表。默认为UTC。
• bin_dir = bin
o 该目录包含Graylog服务器使用的二进制文件。(相对或绝对)
• data_dir = data
o 该目录用于存储Graylog服务器状态。(相对或绝对)
• plugin_dir = plugin
o 在此处设置插件目录(相对或绝对)
Web和REST API
• http_bind_address = 127.0.0.1:9000
o Graylog HTTP接口使用的网络接口。
o 群集中的所有Graylog节点以及使用Graylog Web界面的所有客户端都必须可以访问此网络界面。
o 如果省略端口,默认情况下,Graylog将使用端口9000。
• http_publish_uri = http://
httpb​inda​ddress/o此Graylog节点的HTTPURI,用于与该群集中的其他Graylog节点以及所有使用GraylogWeb界面的客户端进行通信。oURI将在集群发现API中发布,以便其他Graylog节点将能够找到并连接到该Graylog节点。o如果此Graylog节点在 http_bind_address以外的其他网络接口上可用,则必须使用此配置设置,例如,如果计算机具有多个网络接口或在NAT网关后面
o 此配置设置不得配置为通配符地址!
o 如果http_bind_address包含通配符IPv4地址(0.0.0.0),http_publish_uri则将使用此计算机的第一个非环回IPv4地址填充。
• http_external_uri = 
httpp​ublishu​rioGraylogWeb界面将使用Graylog的公共URI与GraylogRESTAPI进行通信。o如果Graylog在反向代理或负载均衡器后面运行,则通常必须指定外部GraylogURI,并且它将用于生成在GraylogRESTAPI中寻址实体的URL(请参阅http_bind_address)
o 使用Graylog收集器时,此URI将用于接收心跳消息,并且所有收集器都必须可以访问该URI。
o 可以根据每个请求使用" X-Graylog-Server-URL" HTTP请求标头覆盖此设置。
• http_enable_cors = true
o 为HTTP接口启用CORS标头。
o 这对于JS客户端直接访问服务器是必需的。
o 如果禁用了这些功能,现代浏览器将无法从服务器检索资源。
• http_enable_gzip = true
o 这样可以压缩API响应,因此有助于减少总体往返时间。
• http_max_header_size = 8192
o HTTP请求标头的最大大小(以字节为单位)。
• http_thread_pool_size = 16
o 专用于服务HTTP接口的线程池的大小。
• http_enable_tls = false
o 这样可以确保与具有TLS的HTTP接口的通信安全,以防止伪造和窃听请求。
• http_tls_cert_file = /path/to/graylog.crt
o PEM格式的X.509证书链文件,用于保护HTTP接口。
• http_tls_key_file = /path/to/graylog.key
o PEM格式的PKCS#8私钥文件,用于保护HTTP接口。
• http_tls_key_password = secret
o 用于解锁用于保护HTTP接口的私钥的密码。(如果密钥已加密)
• trusted_proxies = 127.0.0.1/32, 0:0:0:0:0:0:0:1/128
o 逗号分隔的受信任代理列表,允许使用X-Forwarded-For标头设置客户端地址。可能是子网,也可能是主机。
弹性搜索
• elasticsearch_hosts = http://node1:9200,http://user:password@node2:19200
o Elasticsearch主机Graylog应该连接的列表。
o 需要指定为Elasticsearch节点的http端口的有效URI的逗号分隔列表。
o 如果您的一个或多个Elasticsearch主机需要身份验证,请在每个需要身份验证的节点URI中包括凭据。
o 默认: http://127.0.0.1:9200
• elasticsearch_connect_timeout = 10s
o 等待成功连接到Elasticsearch HTTP端口的最长时间。
o 默认值:10秒
• elasticsearch_socket_timeout = 60s
o 等待从Elasticsearch服务器读回响应的最长时间。
o 默认值:60秒
• elasticsearch_idle_timeout = -1s
o Elasticsearch连接的最大空闲时间。如果超出此范围,则该连接将被断开。
o 默认值:无穷大
• elasticsearch_max_total_connections = 200
o 到Elasticsearch的最大总连接数。
o 默认值:200
• elasticsearch_max_total_connections_per_route = 20
o 每个Elasticsearch路由的最大总连接数(通常意味着每个Elasticsearch服务器)。
o 默认值:20
• elasticsearch_max_retries = 2
o Graylog将重试失败的请求到Elasticsearch的最大次数。
o 默认值:2
• elasticsearch_discovery_enabled = false
o 通过节点信息启用自动Elasticsearch节点发现,请参阅Elasticsearch参考>>集群API>>节点信息。
o 默认: false
警告
如果Elasticsearch需要使用Shield进行身份验证,则自动节点发现将不起作用。
警告
在AWS Elasticsearch Clusters(托管的)上,此设置必须为false,并且应谨慎使用。万一与ES的连接出现问题,这应该是第一个禁用的选项。有关更多详细信息,请参见自动节点发现。
• elasticsearch_discovery_filter = rack:42
o 根据其自定义属性过滤发现中是否包含Elasticsearch节点,请参阅《Elastic Search参考手册》>>《集群API》>>《节点规范》。
o 默认值:空
• elasticsearch_discovery_frequency = 30s
o Elasticsearch节点发现的频率。
o 默认值:30秒
• elasticsearch_discovery_default_scheme = http
o 连接到Elasticsearch发现的节点时,设置默认方案。(可用选项:http,https)
o 默认值:http
• elasticsearch_compression_enabled = false
o 为Elasticsearch请求启用有效负载压缩。
o 默认值:false
• elasticsearch_use_expect_continue = true
o 为Elasticsearch索引请求启用"期望:100个连续"标头。如果禁用此选项,则Graylog无法正确处理HTTP 413请求实体太大错误。
o 默认值:true
回转
注意
以下设置标识为!本节中的内容已移至Graylog 2.0中的数据库。升级时,请确保将它们设置为以前的1.x设置,以便将它们迁移到数据库!
• rotation_strategy = count !
o Graylog将使用多个索引来存储文档。您可以配置该策略来确定何时旋转当前活动的写索引。
o 它支持多种轮换策略:-count每个索引使用的消息elasticsearch_max_docs_per_index -size每个索引使用elasticsearch_max_size_per_index
o 有效值count,size并且time,默认为count。
• elasticsearch_max_docs_per_index = 20000000 !
o 在创建新索引之前,Elasticsearch索引中的(大约)最大文档数,另请参见no_retention和elasticsearch_max_number_of_indices。
o 如果您在上面使用过,请进行配置。rotation_strategy = count
• elasticsearch_max_size_per_index = 1073741824 !
o 在创建新索引之前,磁盘上每个Elasticsearch索引的(大约)最大大小(以字节为单位),另请参见no_retention和elasticsearch_max_number_of_indices。默认值为1GB。
o 如果您在上面使用过,请进行配置。rotation_strategy = size
• elasticsearch_max_time_per_index = 1d !
o (大约)在创建新的Elasticsearch索引之前的最长时间,另请参阅no_retention和elasticsearch_max_number_of_indices。默认值为1天。
o 如果您在上面使用过,请进行配置。rotation_strategy = time
o 请注意,该轮换周期不考虑接收到的消息中指定的时间,而是使用实际时钟值来决定何时轮换索引!
o 使用持续时间和后缀指定所需的时间,以指定时间:
 1w = 1周
 1d = 1天
 12h = 12小时
o 允许的后缀为:d天,h小时,m分钟,s秒。
• elasticsearch_max_number_of_indices = 20 !
o 您要保留多少个索引?
• retention_strategy = delete !
o 确定在达到最大索引数时最旧的索引会发生什么。
o 可以使用以下策略:
 delete -完全删除索引(默认)
 close-关闭索引并将其从系统隐藏。以后可以重新打开。
​
• elasticsearch_disable_version_check = true
o 禁用检查Elasticsearch版本是否与此Graylog版本兼容。
警告
在不受支持和未经测试的Elasticsearch版本中使用Graylog可能会导致数据丢失!
• no_retention = false
o 在该节点上禁用消息保留,即禁用Elasticsearch索引轮换。
​
注意
以下设置用!! 已被移至Graylog 2.2.0中的数据库。升级时,请确保将它们设置为以前的设置,以便将它们迁移到数据库。此设置在第一次启动时被读取一次,成为数据库中的初始设置。
• elasticsearch_shards = 4 !!
o 索引的分片数。一个好的设置在很大程度上取决于您的Elasticsearch集群中的节点数量。如果您有一个节点,请将其设置为1。
• elasticsearch_replicas = 0 !!
o 索引的副本数。一个好的设置在很大程度上取决于您的Elasticsearch集群中的节点数量。如果您有一个节点,请将其设置为0。
注意
elasticsearch_shards并且elasticsearch_replicas仅适用于新创建的索引。
• elasticsearch_index_prefix = graylog !!
o 由Graylog管理的所有Elasticsearch索引和索引别名的前缀。
• elasticsearch_template_name = graylog-internal !!
o Graylog用于应用强制索引映射的Elasticsearch索引模板的名称。
o 默认值:graylog-internal
• elasticsearch_analyzer = standard !!
o 分析器(令牌器),用于消息和full_message字段。通常,"标准"过滤器是一个好主意。
o 所有受支持的分析器为:标准,简单,空白,停止,关键字,模式,语言,雪球,自定义
o Elasticsearch文档:https : //www.elastic.co/guide/zh-CN/elasticsearch/reference/5.6/analysis.html
o 请注意,此设置仅对新创建的索引有效。
• disable_index_optimization = false !!
o 禁用索引循环后优化Elasticsearch索引。在使用大索引的频繁使用的系统上,这可能会给Elasticsearch带来一些负担,但会降低搜索性能。默认设置是优化循环索引。
• index_optimization_max_num_segments = 1 !!
o 将索引优化到<= index_optimization_max_num_segments。在具有大量索引的频繁使用的系统上,更高的数量可能会从Elasticsearch承受一些负担,但会降低搜索性能。预设值为1。
​
• allow_leading_wildcard_searches = false
o 是否要允许使用前导通配符进行搜索?这可能会非常耗费资源,因此应谨慎启用。
o 另请参阅:搜索
• allow_highlighting = false
o 是否要突出显示搜索?根据消息的大小,这可能会占用大量内存,只有在确保您的Elasticsearch群集具有足够的内存后才能启用它。
• elasticsearch_request_timeout = 1m
o 基于尽力限制Elasticsearch操作的运行时间,Elasticsearch请求的全局请求超时(例如,在搜索,索引创建或索引时间范围计算期间)。
o 默认值:1m
• elasticsearch_index_optimization_timeout = 1h
o 索引优化(强制合并)请求的全局超时。
o 默认值:1h
• elasticsearch_index_optimization_jobs = 20
o 同时运行的索引优化(强制合并)作业的最大数量。
o 如果使用大量不同的索引集,则可能需要增加该数目。
o 默认值:20
• index_ranges_cleanup_interval = 1h
o 索引范围信息清除的时间间隔。此设置定义从数据库中清除过时的索引范围信息的频率。
o 默认值:1h
• output_batch_size = 500
o Elasticsearch输出的批次大小。这是Elasticsearch输出模块将立即获得并以批处理调用方式写入Elasticsearch的最大消息数(!)。如果output_flush_interval几秒钟内未达到配置的批处理大小,则将立即刷新所有可用的内容。请记住,每个输出缓冲区处理器都管理自己的批处理并执行自己的批写调用。(outputbuffer_processors变量)
• output_flush_interval = 1
o Elasticsearch输出的刷新间隔(以秒为单位)。这是两批写入Elasticsearch的消息之间的最长时间。仅在此时间段内您的最小消息数小于时才有效。output_batch_size * outputbuffer_processors
• output_fault_count_threshold = 5
• output_fault_penalty_seconds = 30
o 由于仅按需加载流输出,因此将一遍又一遍尝试未初始化的输出。为避免这种情况,以下配置选项定义了在有多少个故障之后,在可配置的秒数内不会再次尝试输出。
• processbuffer_processors = 5
• outputbuffer_processors = 3
o 并行运行的处理器数。
o 如果缓冲区已满,请增加此数字。
• outputbuffer_processor_keep_alive_time = 5000
• outputbuffer_processor_threads_core_pool_size = 3
• outputbuffer_processor_threads_max_pool_size = 30
• udp_recvbuffer_sizes = 1048576
o 所有消息输入(例如SyslogUDPInput)的UDP接收缓冲区大小。
• processor_wait_strategy = blocking
o 等待策略,描述缓冲区处理器如何在游标序列上等待。(默认:睡眠)
o 可能的类型:
 yielding -降低性能和CPU使用率。
 sleeping-降低性能和CPU使用率。安静时段后可能会发生延迟峰值。
 blocking -高吞吐量,低延迟,更高的CPU使用率。
 busy_spinning-避免可能引起延迟抖动的系统调用。线程可以绑定到特定的CPU内核时最好。
• ring_size = 65536
o 内部环形缓冲区的大小。如果加注outputbuffer_processors不再有用,请加注。
o 为了获得最佳性能,环形缓冲区中的LogMessage对象应适合您的CPU L3高速缓存。
o 必须是2的幂。(512、1024、2048等)
• inputbuffer_ring_size = 65536
• inputbuffer_processors = 2
• inputbuffer_wait_strategy = blocking
• message_journal_enabled = true
o 启用基于磁盘的消息日志。
• message_journal_dir = data/journal
o 用于存储消息日志的目录。该目录必须由Graylog独占使用,并且不得包含除Graylog本身创建的文件以外的任何其他文件。
注意
如果为日记文件创建单独的分区,并使用文件系统在根目录中创建" lost + found"之类的目录,则需要为日记创建子目录。否则,Graylog将记录一条错误消息,指出日志已损坏,并且Graylog无法启动。
• message_journal_max_age = 12h
• message_journal_max_size = 5gb
o 日志保留消息,然后才能将其写入Elasticsearch。
o 最长12小时或5 GB,以先到者为准。
o 在正常操作期间,轴颈将较小。
• message_journal_flush_age = 1m
o 此设置允许指定一个时间间隔,在该时间间隔我们将强制对日志数据进行fsync。例如,如果将其设置为1000,则在经过1000 ms之后将进行fsync。
• message_journal_flush_interval = 1000000
o 此设置允许指定一个时间间隔,在该时间间隔我们将强制对日志数据进行fsync。例如,如果将其设置为1,我们将在每条消息之后进行fsync;如果是5,则每隔5条消息就会进行fsync。
• message_journal_segment_age = 1h
o 此配置控制时间段,在这段时间后,即使段文件未满,Graylog也会强制日志滚动,以确保保留可以删除或压缩旧数据。
• message_journal_segment_size = 100mb
注意
当日志已满并且继续接收消息时,它将开始以FIFO队列的形式丢弃消息:第一个丢弃的消息将是第一个插入的消息,依此类推(以此类推)。
• async_eventbus_processors = 2
o 专用于调度内部事件的线程数。默认值为2。
• lb_recognition_period_seconds = 3
o 在将节点标记为DEAD以获得可能的负载平衡器与开始实际的关闭过程之间需要等待多少秒。如果前面没有状态检查负载均衡器,则设置为0。
• lb_throttle_threshold_percentage = 95
o 日志使用百分比,该百分比触发从负载均衡器请求对此服务器节点进行节流的操作。如果未设置,则该功能被禁用。
• stream_processing_timeout = 2000
• stream_processing_max_faults = 3
o 每个消息都与已配置的流匹配,并且可能发生的情况是,流包含的规则花费的运行时间非常少,例如,如果流中使用的规则表达式执行了过多的回溯操作。
o 这将影响整个服务器的处理。为了防止此类行为异常的流规则影响其他流,Graylog限制了每个流的执行时间。
o 默认值如下所示,超时以毫秒为单位。
o 如果与一个流匹配的流花费的时间超过了超时值,并且发生的时间超过了禁用该流的" max_faults"次,并且在Web界面中显示了一条通知。
注意
从0.21开始,Graylog服务器支持可插拔输出模块。这意味着可以将一条消息写入多个输出。下一个设置定义单个输出模块的超时,包括所有消息最终到达的默认输出模块。
• output_module_timeout = 10000
o 等待所有消息输出完成编写单个消息的时间(以毫秒为单位)。
• stale_master_timeout = 2000
o 以毫秒为单位的时间,在此时间之后将在启动时重新检查检测到的陈旧主节点。
• shutdown_timeout = 30000
o Graylog等待所有线程在关闭时停止的时间(以毫秒为单位)。
MongoDB
• mongodb_uri = mongodb://...
o MongoDB连接字符串。在此处输入您的MongoDB连接和身份验证信息。
o 有关详细信息,请参见https://docs.mongodb.com/manual/reference/connection-string/。
o 请注意,+用户名或密码中的-signs必须替换为%2B。
o 例子:
 简单: mongodb://localhost/graylog
 针对MongoDB服务器进行身份验证: mongodb_uri = mongodb://grayloguser:secret@localhost:27017/graylog
 使用副本集而不是单个主机: mongodb://grayloguser:secret@localhost:27017,localhost:27018,localhost:27019/graylog?replicaSet=rs01
 DNS种子列表设置为mongodb+srv://server.example.org/graylog。
• mongodb_max_connections = 1000
o 如果遇到MongoDB连接问题,请根据您的MongoDB服务器可以从单个客户端处理的最大连接数来增加此值。
• mongodb_threads_allowed_to_block_multiplier = 5
o MongoDB连接乘数允许阻止的线程数。默认值:5
o 如果mongodb_max_connections为100,mongodb_threads_allowed_to_block_multiplier则为5,则可能会阻塞500个线程。除此之外,还会引发异常。
o http://api.mongodb.com/java/current/com/mongodb/MongoOptions.html#threadsAllowedToBlockForConnectionMultiplier
电子邮件
• transport_email_enabled = false
• transport_email_hostname = mail.example.com
• transport_email_port = 587
• transport_email_use_auth = true
• transport_email_use_tls = true
o 使用STARTTLS启用SMTP以进行加密连接。
• transport_email_use_ssl = false
o 为加密连接启用SSL上的SMTP(SMTPS)。
注意
确保仅启用这两个设置之一,因为大多数(或所有)SMTP服务仅在同一端口上支持一种加密机制。大多数SMTP服务都支持具有STARTTLS的SMTP,而大多数SMTP服务都已弃用SMTPS。false当您想通过未加密的连接发送时,需要将两者都设置为。
• transport_email_auth_username = you@example.com
• transport_email_auth_password = secret
• transport_email_subject_prefix = [graylog]
• transport_email_from_email = graylog@example.com
• transport_email_web_interface_url = https://graylog.example.com
o 指定此选项可在流警报邮件中包含流的链接。
o 这应该将完全限定的基本URL定义为您的Web界面,与用户访问该URL的方式完全相同。
HTTP
• http_connect_timeout = 5s
o 传出HTTP连接的默认连接超时。
o 值必须为正值(在转换为毫秒时,介于1和2147483647之间)。
o 默认值:5s
• http_read_timeout = 10s
o 传出HTTP连接的默认读取超时。
o 值必须为正值(在转换为毫秒时,介于1和2147483647之间)。
o 默认值:10秒
• http_write_timeout = 10s
o 传出HTTP连接的默认写超时。
o 值必须为正值(在转换为毫秒时,介于1和2147483647之间)。
o 默认值:10秒
• http_proxy_uri =
o 传出HTTP连接的HTTP代理
注意
如果您配置代理,请确保还配置" http_non_proxy_hosts"选项,以便与其他节点的内部HTTP连接不会通过代理。
• http_non_proxy_hosts =
o 绕过配置的代理服务器应直接访问的主机列表。
o 这是用","分隔的模式列表。模式可以以通配符" *"开头或结尾。
o 匹配这些模式之一的任何主机都将通过直接连接而不是通过代理访问。
处理状态
注意
通常不需要调整处理状态的设置。
• processing_status_persist_interval = 1s
o 服务器正在定期将处理状态信息写入数据库。此设置控制将数据写入数据库的频率。
o 值必须为正值,并且不能小于一秒。
o 默认值:1秒(一秒)
• processing_status_update_threshold = 1m
o 配置检测过时的处理状态记录的阈值。在配置的阈值中尚未更新的所有记录都将被忽略。
o 值必须为正值,并且不能小于一秒。
o 默认值:1m(一分钟)
• processing_status_journal_write_rate_threshold= 1
o 配置日志写速率阈值以选择处理状态记录。一分钟速率低于配置值的任何记录都将被忽略。(取决于日记中的邮件数量)
o 值必须为正值。
o 默认值:1
脚本警报通知
• integrations_web_interface_uri = https://graylog.example.com
o 指定此选项可在脚本参数或JSON中的标准中包括搜索页面链接(显示相关警报消息)。
o 这应该将完全限定的基本URL定义为您的Web界面,与用户访问该URL的方式完全相同。
o 默认值:无
• integrations_scripts_dir = /usr/share/graylog-server/scripts
o 允许从中执行脚本的绝对或相对路径。
o 如果指定,它将覆盖默认位置(请参见"文件位置"文档。
其他
• gc_warning_threshold = 1s
o 垃圾收集的阈值运行。如果GC的运行时间超过此阈值,则会生成系统通知,以警告管理员系统可能存在的问题。默认值为1秒。
• ldap_connection_timeout = 2000
o 已配置的LDAP服务器(例如ActiveDirectory)的连接超时(以毫秒为单位)。
• disable_sigar = false
o 禁止使用SIGAR收集系统统计信息。
• dashboard_widget_default_cache_time = 10s
o 仪表板小部件的默认缓存时间。(默认:10秒,最小:1秒)
• proxied_requests_thread_pool_size = 32
o 对于某些与群集相关的REST请求,该节点必须查询群集中的所有其他节点。这是可用于此目的的最大线程数。如果/cluster/*请求需要很长时间才能完成,请增加它。
o 应该是,如果你有一个高并发用户数。http_thread_pool_size * average_cluster_size
• default_events_index_prefix = gl-events
o Graylog事件的默认索引前缀。
• default_system_events_index_prefix = gl-system-events
o Graylog系统事件的默认索引前缀。
• enabled_tls_protocols = TLSv1.2,TLSv1.3
o 配置系统范围内启用的TLS协议。仅在需要支持旧系统时才进行配置。我们将维持安全的默认设置。(当前为TLS 1.2和TLS 1.3)。(注意:Web界面不支持JDK 8的TLS 1.3)
• content_packs_loader_enabled = false
o 在Graylog的第一次启动时自动将内容包加载到" content_packs_dir"中。
• content_packs_dir = data/contentpacks
o 该目录包含应在Graylog的第一个开始处加载的内容包。
• content_packs_auto_install
o 以逗号分隔的内容包列表(" content_packs_dir"中的文件),应在Graylog的第一个开始处应用。
o 默认值:无

六、优化

网络和 REST API

  • http_enable_gzip = true
    这会压缩 API 响应,因此有助于减少整体往返时间。
  • http_max_header_size = 8192
    HTTP 请求标头的最大大小(以字节为单位)。
  • http_thread_pool_size = 16
    专门用于为 HTTP 接口提供服务的线程池的大小。
  • http_enable_tls = false
    这通过 TLS 保护与 HTTP 接口的通信,以防止请求伪造和窃听。
    Elasticsearch
  • elasticsearch_connect_timeout = 10s
    等待成功连接到 Elasticsearch HTTP 端口的最长时间。
    默认值:10 秒
  • elasticsearch_socket_timeout = 60s
    等待从 Elasticsearch 服务器读回响应的最长时间。
    默认值:60 秒
  • elasticsearch_idle_timeout = -1s
    Elasticsearch 连接的最长空闲时间。如果超过这个值,这个连接将被断开。
    默认值:无穷大
  • elasticsearch_max_total_connections = 200
    Elasticsearch 的最大总连接数。
    默认值:200
  • elasticsearch_max_total_connections_per_route = 20
    每个 Elasticsearch 路由的最大总连接数(通常是指每个 Elasticsearch 服务器)。
    默认值:20
  • elasticsearch_max_retries = 2
    Graylog 将向 Elasticsearch 重试失败请求的最大次数。
    默认值:2
    Rotation
  • rotation_strategy = count !
    Graylog 将使用多个索引来存储文档。您可以配置它使用的策略来确定何时轮换当前活动的写入索引。

它支持多种轮换策略:-count 每个索引的消息,使用elasticsearch_max_docs_per_index - size 每个索引,使用elasticsearch_max_size_per_index

有效值为count, size, 和 time; 默认是count。

  • elasticsearch_max_docs_per_index = 20000000 !
    在创建新索引之前,Elasticsearch 索引中的(近似)最大文档数;另见 no_retention 和 elasticsearch_max_number_of_indices.
    如果您在rotation_strategy = count 上面使用过,请配置它。
  • elasticsearch_max_size_per_index = 1073741824 !
    在创建新索引之前,磁盘上每个 Elasticsearch 索引的(近似)最大大小(以字节为单位);另见no_retention 和elasticsearch_max_number_of_indices。默认为 1GB。
    如果您在rotation_strategy = size 上面使用过,请配置它。
  • elasticsearch_max_time_per_index = 1d !
    创建新 Elasticsearch 索引之前的(近似)最长时间;另见 no_retention 和elasticsearch_max_number_of_indices。默认为 1 天。
    如果您在rotation_strategy = time 上面使用过,请配置它。

请注意,这个轮转周期并不看收到的消息中指定的时间,而是使用真实的时钟值来决定何时轮转索引!

使用持续时间和表示所需单位的后缀指定时间:

  • 1w = 1 周
  • 1d = 1 天
  • 12h = 12 小时
    允许的后缀是:d 天、 h 小时、m 分钟、 s 秒。
  • elasticsearch_max_number_of_indices = 20 !
    你想保留多少索引?

MongoDB

  • mongodb_max_connections = 1000
    如果您遇到 MongoDB 连接问题,请根据您的 MongoDB 服务器可以从单个客户端处理的最大连接数增加此值。
  • mongodb_threads_allowed_to_block_multiplier = 5
    MongoDB 连接乘数允许阻塞的线程数。默认值:5
    如果mongodb_max_connections 是100,并且mongodb_threads_allowed_to_block_multiplier 是5,那么500个线程可以阻塞。不止于此,将抛出异常。

七、升级

升级 Graylog 时不要跳过主要版本。例如,要从 4.0.x 升级到 4.3.x,您必须先升级到最新的次要版本 4.0.x、4.1.x 和 4.2.x,然后再升级到 4.3.x。

server.conf在重新启动 Graylog 服务器之前,您可能还需要对 Graylog 配置文件执行手动编辑。

确保在升级 Graylog 堆栈的任何组件之前备份 MongoDB 和 Elasticsearch/OpenSearch 数据库状态以创建回滚选项。

在准备升级 Graylog 时,您必须首先满足任何软件先决条件。MongoDB 和 Elasticsearch/OpenSearch 必须至少运行您希望升级到的 Graylog 版本所需的最低要求版本。

请参考下表确定您的版本兼容性要求:

八、监控

使用zabbix 监控graylog,在zabbix官方网站上有graylog的监控模板,

地址:https://share.zabbix.com/templates/applications-monitoring-system-template-graylog-node-monitoring-using-zabbix/

监控包获取

github地址为https://github.com/bezarsnba/zabbix-graylog-monitoring

Python版本只少是大于等于python3.4版本

配置zabbix-agent

配置python

下载monitoring-graylog.py文件并将其复制到服务器上的新建的scripts文件夹:

更改monitoring-graylog.py文件中的变量,分别在15,16,23行,修改自己graylog的配置

通过传递lldgraylognode参数运行脚本

显示结果 :说明配置成功

下载user_parameter_graylog.conf并复制到/etc/zabbix/zabboix_agentd.d/下

然后编辑文件,将/usr/bin/python3.4替换为/usr/bin/python3

zabbix服务器上导入模板

根据实际情况,选择版本模板导入,模板上没有图形,但是有很多自动发现的监控项,自己绘制图形即可

然后再最新数据中,确认获取到最新数据数值,表明监控生效

九、常见问题及处理

1、graylog启动但是未监听到9000端口

查看日志:ERROR [VersionProbe] Unable to retrieve version from Elasticsearch node: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:9200. - Connection refused.

ES服务状态查询

配置文件es配置排查

2、Graylog日志查询超过10000限制问题

在使用graylog时,默认分页查询存在限制,真实使用不能满足,需要我们手动处理。当查询超过执行长度时,会出现一下错误提示

While retrieving data for this widget, the following error(s) occurred:

Unable to perform search query: Elasticsearch exception [type=illegal_argument_exception, reason=Result window is too large, from + size must be less than or equal to: [10000] but was [3382050]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.].

📙Elasticsearch检索问题

📐Elasticsearch的max_result_window限制

问题描述

查询超过10000页,Elasticsearch出现异常

Elasticsearch exception [type=illegal_argument_exception, reason=Result window is too large, from + size must be less than or equal to: [10000] but was [7135950]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.].

解决方案

方案一:修改配置文件,重启Elasticsearch服务【Elasticsearch5.x版本以后不支持】

修改Elasticsearch 集群中的 配置文件 config/elasticsearch.yml

在配置文件最后增加一行,如下:

index.max_result_window: 1000000

方案二:通过接口修改具体的index

具体操作命令,如下(比如,设置可查询 1000000 条数据,其中 alarm 是index名称):

推荐使用全局修改方式。

# 修改个别索引
PUT alarm/_settings
{ 
  "max_result_window" : 1000000
} 
# 修改全局 100W
PUT _settings
{
    "index": {
        "max_result_window": "1000000"
    }
}  
Curl方式
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_all/_settings -d '{ "index" : { "max_result_window" : 1000000}}'

3、Deflector exists as an index and is not an alias

官方的步骤

-停止所有Graylog节点

-(可选)如果您想保留已摄取的消息,请通过Elasticsearch reindex API将其重新索引到具有最大数量的Elasticsearch索引中,例如,如果您想修复偏转器graylog_deflector,请使用graylog_23。

-通过Elasticsearch Delete index API删除graylog_deflector索引。

-将action.auto_create_index:false添加到集群中所有Elasticsearch节点的配置文件中,并重新启动这些Elasticearch节点,有关详细信息,请参阅Elasticsearch索引API-自动创建索引和创建索引。

-启动Graylog主节点。

-手动旋转维护下拉菜单中系统/索引/索引集页面上索引集的活动写入索引。

-(可选)启动所有剩余的Graylog从属节点。

实际上我们可以不按照官方的做法,以下是一些实践(前提是现有的数据不是很重要,可以删除的)

  • 可以不用停止graylog server
  • 修改es 配置,添加action.auto_create_index: false注意需要重启es集群,理论上单台重启不会有影响的(和部署模型也有关系)
  • 删除*_deflector 索引(可以通过api以及ui)
  • 手工 rotate active write
相关推荐
Style-MJ1 小时前
graylog~认识一下-日志管理平台
graylog
今夜有雨.1 小时前
线程同步与Mutex
c语言·c++·经验分享·笔记·后端·架构·学习方法
StarRocks_labs2 小时前
从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型
大数据·架构·spark·湖仓一体·lakehouse
bennybi2 小时前
基于Docker的Kafka分布式集群
分布式·docker·kafka
2401_897592643 小时前
系统架构演进:从单体到微服务的智能转型
前端·微服务·架构·系统架构
兔子宇航员03013 小时前
数据开发面经常见题整理-1
大数据·分布式·spark
言之。5 小时前
【大数据2025】Hadoop 万字讲解
大数据·hadoop·分布式
小Mie不吃饭11 小时前
彻底讲清楚 单体架构、集群架构、分布式架构及扩展架构
java·分布式·spring cloud·架构·springboot