docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker搭建Graylog分布式日志

基于Docker搭建Graylog分布式日志采集系统的详细过程

作者:老友@

Graylog是一个开源的日志管理工具,支持日志收集、解析、存储、搜索和可视化,它可以从各种数据源收集日志,并通过内置的解析器将日志格式化,本文介绍基于Docker搭建Graylog分布式日志采集系统,感兴趣的朋友一起看看吧

一、简介

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

二、Graylog

1、主要特点

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

2、组件

3、工作流程介绍

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

最小化单机部署

最优化集群部署

配置 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 来收集日志

4、使用场景

三、Graylog 安装部署

1、 安装 docker

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

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

2、安装docker compose 国内镜像秒下载

curl -L https://get.daocloud.io/docker/compose/releases/download/2.16.0/docker-compose-`uname -s`-`uname -m`  > /usr/local/bin/docker-compose

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

修改文件执行权限

sudo chmod +x /usr/local/bin/docker-compose

创建软链

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功

docker-compose --version

3、 安装graylog

创建目录

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

目录赋权

chmod -R +777 /opt/graylog/mongo_data
chmod -R +777 /opt/graylog/es_data
chmod -R +777 /opt/graylog/graylog_data

进入/opt/graylog/graylog_data/config目录

cd /opt/graylog/graylog_data/config

下载配置文件

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

目录赋权

chown -R 1100:1100 /opt/graylog/graylog_data

设置查询高亮和国内时区

vim /opt/graylog/graylog_data/config/graylog.conf

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

进入/opt/graylog目录

cd /opt/graylog

创建docker-compose.yml文件

vim docker-compose.yml

文件内容如下

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

开始安装(也是启动命令)

docker-compose up -d

指定文件启动

docker-compose -f docker-compose.yml up -d

停止

docker-compose down

指定文件停止

docker-compose -f docker-compose.yml down

验证安装

docker ps

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

版本兼容要求

见官方文档说明链接:
https://go2docs.graylog.org/5-2/downloading_and_installing_graylog/installing_graylog.html

4、Graylog控制台

测试

安装完成之后,访问

http://127.0.0.1:9000/  (或 ip:9000)


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

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

设置Graylog日志保留时间

四、springboot集成Graylog

项目pom.xml中引入logback-gelf

        <!--  graylog 日志依赖      -->
        <dependency>
            <groupId>de.siegmar</groupId>
            <artifactId>logback-gelf</artifactId>
            <version>3.0.0</version>
        </dependency>

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

项目logback文件中加入 Gelf Appender

在application.yaml 中指定logback的配置文件

#配置logback日志组件
logging:
  config: classpath:logback.xml

在 logback.xml配置文件中加入GelfTcpAppender (GELF_LOG 为graylog的日志记录)
(为了防止graylog出现故障,可以在本地和graylog中同时记录日志)

<?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>
        <!-- 仅记录 ERROR 级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 排除带有 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>

配置GrayLog

此时需要配置GrayLog 的input选择 新增TCP 或 UDP 的输入

测试日志收集

到此这篇关于基于Docker搭建Graylog分布式日志采集系统的文章就介绍到这了,更多相关docker搭建Graylog分布式日志内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文