基于Docker搭建Graylog分布式日志采集系统

文章目录


一、简介

Graylog是一个开源的日志管理工具,主要功能包括日志收集、解析、存储、搜索和可视化。它可以从各种数据源(如应用程序、系统和网络设备)收集日志,通过内置的解析器将日志格式化并存储在数据库中。用户可以使用其强大的搜索功能快速查找特定日志,设置告警规则以监控关键事件,且支持创建自定义仪表板和图表以可视化数据。这样,Graylog帮助用户实时监控系统健康,快速定位问题源,并进行深入分析。

二、Graylog

1、主要特点

  1. 日志收集:支持从多种数据源(如系统日志、应用日志、网络设备)收集日志数据,通过多种输入插件(如Syslog、HTTP、Kafka)进行接入。
  2. 日志解析:通过内置的解析器和提取器将日志数据标准化和格式化,支持对复杂日志数据进行提取和解析,使数据更加结构化和可操作。
  3. 存储和索引:将日志数据存储在Elasticsearch中,利用其高效的索引和搜索功能来处理大规模的日志数据。
  4. 实时搜索:提供强大的搜索功能,支持基于时间、字段和内容的复杂查询,以快速检索和分析日志信息。
  5. 可视化:允许创建自定义的仪表板、图表和报告,实时展示关键指标和日志数据的趋势,帮助用户更直观地理解系统状态和性能。
  6. 告警和通知:支持设置告警条件,根据日志内容或系统指标触发通知,及时响应潜在问题或异常情况。
  7. 用户管理:提供多级别的权限控制,允许管理员配置用户角色和权限,以确保数据访问的安全性和合规性。
  8. 插件和扩展:支持通过插件扩展功能,包括自定义输入、处理管道、输出插件等,以满足特定需求。

这些功能共同作用,使Graylog成为一个强大的日志管理和分析工具,帮助用户实时监控和优化系统性能。

2、组件

  1. Graylog Server:核心组件,负责处理和分析日志数据。包括接收、解析、存储、索引和搜索功能。
  2. Elasticsearch:用于存储和索引日志数据的搜索引擎,支持高效的全文搜索和复杂查询。
  3. MongoDB:存储Graylog的配置数据、用户信息和其他元数据。
  4. Graylog Web Interface:基于Web的用户界面,提供日志搜索、仪表板创建、报告生成和告警配置功能。

3、工作流程介绍

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

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


最小化单机部署


最优化集群部署

配置 Graylog 服务的核心就是理解对应组件的功能以及其运作方式!

简单来讲,Input 表示日志数据的来源,对不同来源的日志可以通过 Extractors 来进行日志的字段转换,比如将日记 Nginx 的状态码变成对应的英文表述等。然后,通过不同的标签类型组成不同的标签 Stream,并将这些日志数据存储到指定的地方 Index 库中进行了持久化保存。

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

    中日志搜索的基本单位是 Stream,每个 Stream 可以有自己单独的 Elastic Index Set,也可以共享一个 Index

    Set。

  • Extractor 在 System/Input 中配置。Graylog 中很方便的一点就是可以加载一条日志,然后基于这个实际的例子进行配置并能直接看到结果。内置的 Extractor 基本可以完成各种字段提取和转换的任务,但是也有些限制,在应用里写日志的时候就需要考虑到这些限制。Input 可以配置多个 Extractors,按照顺序依次执行。

  • 系统会有一个默认的 Stream,所有日志默认都会保存到这个 Stream 中,除非匹配了某个 Stream,并且这个 Stream 里配置了不保存日志到默认 Stream。可以通过菜单 Streams 创建更多的 Stream,新创建的 Stream 是暂停状态,需要在配置完成后手动启动。Stream 通过配置条件匹配日志,满足条件的日志添加 stream ID 标识字段并保存到对应的 Elastic Index Set 中。

  • Index Set 通过菜单 System/Indices 创建。日志存储的性能,可靠性和过期策略都通过 Index Set 来配置。性能和可靠性就是配置 Elastic Index 的一些参数,主要参数包括,Shards 和 Replicas。

  • 除了上面提到的日志处理流程,Graylog 还提供了 Pipeline 脚本实现更灵活的日志处理方案。这里不详细阐述,只介绍如果使用 Pipelines 来过滤不需要的日志。下面是丢弃 level > 6 的所有日志的 Pipeline Rule 的例子。从数据采集(input),字段解析(extractor),分流到 stream,再到 pipeline 的清洗,一气呵成,无需再通过其他方式进行二次加工。

  • Sidecar 是一个轻量级的日志采集器,通过访问 graylog 进行集中式管理,支持 linux 和 windows 系统。Sidecar 守护进程会定期访问 graylog 的 REST API 接口获取 Sidecar 配置文件中定义的标签(tag) ,Sidecar 在首次运行时会从 graylog 服务器拉取配置文件中指定标签(tag) 的配置信息同步到本地。目前 Sidecar 支持 NXLog,Filebeat 和 Winlogbeat。他们都通过 graylog 中的 web 界面进行统一配置,支持 Beats、CEF、Gelf、Json API、NetFlow 等输出类型。Graylog 最厉害的在于可以在配置文件中指定 Sidecar 把日志发送到哪个 graylog 群集,并对 graylog 群体中的多个 input 进行负载均衡,这样在遇到日志量非常庞大的时候,graylog 也能应付自如。

  • 日志集中保存到 Graylog 后就可以方便地使用搜索器了。不过有时候还是需要对数据进行近一步的处理。主要有两个途径,分别是直接访问。 Elastic 中保存的数据,或者通过 Graylog 的 Output 转发到其它服务。


使用 Graylog 来收集日志

4、使用场景

  1. 系统监控:实时收集和分析系统日志,监控服务器、应用程序和网络设备的健康状态和性能。
  2. 故障排除:快速定位系统或应用程序中的问题,通过日志搜索和分析找到错误和异常的根源。
  3. 安全事件管理:跟踪和分析安全日志,检测异常行为,识别潜在的安全威胁。
  4. 合规性审计:记录和存档日志数据,满足行业合规性要求,如PCI-DSS、HIPAA等。
  5. 性能优化:分析日志数据以了解系统性能瓶颈,优化资源分配和应用程序性能。
  6. 运维自动化:设置告警和自动化响应策略,减少人工干预,提高运维效率。

三、Graylog 安装部署

1、 安装 docker

linux上进行docker安装有两种方式:

  1. Docker自动化安装
  2. Docker手动安装

可以根据该文章的步骤进行安装:https://blog.csdn.net/weixin_44876263/article/details/136714078?spm=1001.2014.3001.5502

2、安装docker compose

  1. 国内镜像秒下载
bash 复制代码
	curl -L https://get.daocloud.io/docker/compose/releases/download/2.16.0/docker-compose-`uname -s`-`uname -m`  > /usr/local/bin/docker-compose

如果遇到版本更新,把版本数字更改一下就可以了。

  1. 修改文件执行权限
bash 复制代码
	sudo chmod +x /usr/local/bin/docker-compose
  1. 创建软链
bash 复制代码
	sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  1. 测试是否安装成功
bash 复制代码
	docker-compose --version

3、 安装graylog

  1. 创建目录
bash 复制代码
	mkdir -p /opt/graylog/mongo_data
	mkdir -p /opt/graylog/es_data
	mkdir -p /opt/graylog/graylog_data
	mkdir -p /opt/graylog/graylog_data/config
  1. 目录赋权
bash 复制代码
chmod -R +777 /opt/graylog/mongo_data
chmod -R +777 /opt/graylog/es_data
chmod -R +777 /opt/graylog/graylog_data
  1. 进入/opt/graylog/graylog_data/config目录
bash 复制代码
cd /opt/graylog/graylog_data/config
  1. 下载配置文件
bash 复制代码
wget http://raw.githubusercontent.com/Graylog2/graylog-docker/4.3/config/graylog.conf
wget http://raw.githubusercontent.com/Graylog2/graylog-docker/4.3/config/log4j2.xml
  1. 目录赋权
bash 复制代码
chown -R 1100:1100 /opt/graylog/graylog_data
  1. 设置查询高亮和国内时区
bash 复制代码
vim /opt/graylog/graylog_data/config/graylog.conf

国内时区:root_timezone = PRC
查询高亮:allow_highlighting = true

  1. 进入/opt/graylog目录
bash 复制代码
cd /opt/graylog
  1. 创建docker-compose.yml文件
bash 复制代码
vim docker-compose.yml
  • 文件内容如下
bash 复制代码
version: '3'
services: 
  mongodb:
    container_name: mongodb
    image: mongo:4.4.0
    restart: always
    volumes:
      - /opt/graylog/mongo_data:/data/db
      - /etc/localtime:/etc/localtime:ro
      - /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro
 
 
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
    container_name: elasticsearch
    restart: always
    volumes:
      - /opt/graylog/es_data:/usr/share/elasticsearch/data
      - /etc/localtime:/etc/localtime:ro
      - /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - TZ=Asia/Shanghai
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - http.cors.allow-origin=*
      - http.cors.enabled=true
      - discovery.type=single-node
      - 'ES_JAVA_OPTS=-Xms1024m -Xmx1024m'
 
 
  graylog:
    image: graylog/graylog:4.3.6
    container_name: graylog
    restart: always
    volumes:
      - /opt/graylog/graylog_data:/usr/share/graylog/data
      - /etc/localtime:/etc/localtime:ro
      - /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro
    environment:
      # CHANGE ME (must be at least 16 characters)!
      - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
      # Password: admin
      - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
      - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/
      - GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog
      - GRAYLOG_ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - TZ=Asia/Shanghai
    entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 --  /docker-entrypoint.sh
    depends_on:
      - mongodb
      - elasticsearch
    links:
      - 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:12201/udp
  1. 开始安装(也是启动命令)
bash 复制代码
docker-compose up -d
  1. 指定文件启动
bash 复制代码
docker-compose -f docker-compose.yml up -d
  1. 停止
bash 复制代码
docker-compose down
  1. 指定文件停止
bash 复制代码
docker-compose -f docker-compose.yml down
  1. 验证安装
bash 复制代码
docker ps

可以看见 graylog 容器的运行情况,可以看到 12201 udp这样才算成功

版本兼容要求

见官方文档说明链接:

https://go2docs.graylog.org/5-2/downloading_and_installing_graylog/installing_graylog.html

4、Graylog控制台

  1. 测试

安装完成之后,访问

bash 复制代码
http://127.0.0.1:9000/  (或 ip:9000)

默认docker-compose.yml文件设置的账号密码

账号:admin

密码:admin

至此,Graylog分布式日志服务就安装成功了

  1. 设置Graylog日志保留时间

  • 在导航栏中选择"System"。
  • 在左侧面板中选择"Indices"。
  • 在"Indices"页面中,可以看到已经存在的索引以及它们的相关信息。
  • 在这里,点击"Edit"按钮来编辑索引的保留策略。
  • 在弹出的窗口中,可以设置索引的保留策略,包括保留时间、最大文档数、最大索引大小等。

四、springboot集成Graylog

  1. 项目pom.xml中引入logback-gelf
bash 复制代码
        <!--  graylog 日志依赖      -->
        <dependency>
            <groupId>de.siegmar</groupId>
            <artifactId>logback-gelf</artifactId>
            <version>3.0.0</version>
        </dependency>

这样就可以再logback配置文件中加入 GelfTcpAppender GelfUdpAppender

  1. 项目logback文件中加入 Gelf Appender
  • 在application.yaml 中指定logback的配置文件
bash 复制代码
#配置logback日志组件
logging:
  config: classpath:logback.xml
  • 在 logback.xml配置文件中加入GelfTcpAppender (GELF_LOG 为graylog的日志记录)
    (为了防止graylog出现故障,可以在本地和graylog中同时记录日志)
bash 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_HOME" value="./logs"/>
    <property name="APP_NAME" value="cx-mail"/>
    <property name="LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS}\t%-5level\t%thread\t%logger\t%file:%line\t[%X{traceid}]\t%msg%n"/>


    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!-- INFO 日志文件 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/info.${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>64MB</maxFileSize>
            <maxHistory>15</maxHistory>
            <totalSizeCap>32GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
            <immediateFlush>true</immediateFlush>
        </encoder>
        <!-- 排除带有 apiLogger marker 的日志 -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
                <marker>apiLogger</marker>
            </evaluator>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>

    <!-- ERROR 日志文件 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error.${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>64MB</maxFileSize>
            <maxHistory>15</maxHistory>
            <totalSizeCap>32GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
            <immediateFlush>true</immediateFlush>
        </encoder>
        <!-- 排除带有 apiLogger marker 的日志 -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
                <marker>apiLogger</marker>
            </evaluator>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>

    <!-- graylog日志配置 -->
    <appender name="GELF_LOG" class="de.siegmar.logbackgelf.GelfUdpAppender">
        <!-- Graylog服务的地址 -->
        <graylogHost>10.0.32.199</graylogHost>
        <!-- UDP Input端口 -->
        <graylogPort>12201</graylogPort>
        <!--以下为可选配置-->
        <maxChunkSize>508</maxChunkSize>
        <useCompression>true</useCompression>
        <encoder class="de.siegmar.logbackgelf.GelfEncoder">
            <!-- 是否发送原生的日志信息 -->
            <includeRawMessage>true</includeRawMessage>
            <includeMarker>true</includeMarker>
            <includeMdcData>true</includeMdcData>
            <includeCallerData>true</includeCallerData>
            <includeRootCauseData>true</includeRootCauseData>
            <includeLevelName>true</includeLevelName>

            <!-- 是否发送日志级别的名称,否则默认以数字代表日志级别 -->
            <includeLevelName>true</includeLevelName>
            <shortPatternLayout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%m%nopex</pattern>
            </shortPatternLayout>
            <fullPatternLayout class="ch.qos.logback.classic.PatternLayout">
                <!-- 使用定义的格式模式 -->
                <pattern>[%-5level]\t%d{yyyy-MM-dd HH:mm:ss.SSS}\t%thread\t%logger\t%file:%line\t[%X{traceid}]\t%msg%n</pattern>
            </fullPatternLayout>
            <!--
             配置应用名称(服务名称),通过staticField标签可以自定义一些固定的日志字段
            -->
            <staticField>app_name:${APP_NAME}</staticField>
        </encoder>
    </appender>

    <logger name="com.cx" level="INFO"/>

    <!-- 日志级别排序为: TRACE < DEBUG < INFO < WARN < ERROR -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
        <appender-ref ref="GELF_LOG"/>
    </root>
</configuration>
  1. 配置GrayLog
  • 此时需要配置GrayLog 的input选择 新增TCP 或 UDP 的输入
  1. 测试日志收集
相关推荐
求积分不加C3 分钟前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan05294 分钟前
javaer快速上手kafka
分布式·kafka
sinat_384241091 小时前
使用 npm 安装 Electron 作为开发依赖
服务器
朝九晚五ฺ1 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream1 小时前
Linux的桌面
linux
xiaozhiwise2 小时前
Makefile 之 自动化变量
linux
Kkooe3 小时前
GitLab|数据迁移
运维·服务器·git
wuxingge3 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
谭震鸿4 小时前
Zookeeper集群搭建Centos环境下
分布式·zookeeper·centos