【苍狮技术团队】打造高效日志系统:Graylog + Docker 快速部署 + Spring Boot 日志集成全攻略

620 阅读3分钟

一、Graylog介绍

Graylog 是一款功能强大的日志管理和分析工具,广泛应用于集中化日志管理、实时监控与告警等领域。它为企业提供了一个全面的解决方案,帮助用户高效地收集、索引和分析来自各种数据源的日志信息。Graylog 支持通过插件扩展其功能,并拥有友好的用户界面,使得搜索、可视化及报告生成变得简单直观。此外,该平台还支持多种集成方式,允许与其他软件如LDAP、Active Directory等进行整合,增强用户认证和权限管理。

  1. 官网:graylog.org/
  2. GitHub:github.com/Graylog2/gr…

二、Graylog一键部署

docker-compose安装

  1. 参考地址:mp.weixin.qq.com/s/vlbYzEnCB…

Graylog部署

官方安装文档

  1. 官方部署文档:go2docs.graylog.org/current/dow…
  2. GitHub yaml文件:github.com/Graylog2/do…

博主自定义yaml

  1. 建议大家先参考官方文档了解docker-compose里面的文件,博主对yaml进行了小的改动,比如镜像使用了国内的镜像源、把挂载卷去掉了,默认在docker-compose.yaml目录进行持久化至宿主机;
  2. 执行以下代码进行部署:
mkdir -p /data/graylog
vi docker-compose.yaml
# For DataNode setup, graylog starts with a preflight UI, this is a change from just using OpenSearch/Elasticsearch.
# Please take a look at the README at the top of this repo or the regular docs for more info.

services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    image: "crpi-33mr80vehc50lqh8.cn-chengdu.personal.cr.aliyuncs.com/yunxinai/mongo:6.0"  
    restart: "on-failure"
    networks:
      - graylog
    volumes:
      - "./volumes/mongodb/data/db:/data/db"
      - "./volumes/mongodb/data/configdb:/data/configdb" 

  # For DataNode setup, graylog starts with a preflight UI, this is a change from just using OpenSearch/Elasticsearch.
  # Please take a look at the README at the top of this repo or the regular docs for more info.
  # Graylog Data Node: https://hub.docker.com/r/graylog/graylog-datanode
  datanode:
    image: "crpi-33mr80vehc50lqh8.cn-chengdu.personal.cr.aliyuncs.com/yunxinai/graylog-datanode:6.3.1"
    hostname: "datanode"
    environment:
      GRAYLOG_DATANODE_NODE_ID_FILE: "/var/lib/graylog-datanode/node-id"
      # GRAYLOG_DATANODE_PASSWORD_SECRET and GRAYLOG_PASSWORD_SECRET MUST be the same value
      GRAYLOG_DATANODE_PASSWORD_SECRET: "${GRAYLOG_PASSWORD_SECRET:?Please configure GRAYLOG_PASSWORD_SECRET in the .env file}"
      GRAYLOG_DATANODE_MONGODB_URI: "mongodb://mongodb:27017/graylog"
    ulimits:
      memlock:
        hard: -1
        soft: -1
      nofile:
        soft: 65536
        hard: 65536
    ports:
      - "8999:8999/tcp"   # DataNode API
      - "9200:9200/tcp"
      - "9300:9300/tcp"
    networks:
      - graylog  
    volumes:
      - "./volumes/datanode/var/lib/graylog-datanode:/var/lib/graylog-datanode"
    restart: "on-failure"

  # Graylog: https://hub.docker.com/r/graylog/graylog-enterprise
  graylog:
    hostname: "server"
    image: "crpi-33mr80vehc50lqh8.cn-chengdu.personal.cr.aliyuncs.com/yunxinai/graylog:6.3.1"
    depends_on:
      mongodb:
        condition: "service_started"
      datanode:
        condition: "service_started"
    entrypoint: "/usr/bin/tini --  /docker-entrypoint.sh"
    environment:
      GRAYLOG_NODE_ID_FILE: "/usr/share/graylog/data/data/node-id"
      # GRAYLOG_DATANODE_PASSWORD_SECRET and GRAYLOG_PASSWORD_SECRET MUST be the same value
      GRAYLOG_PASSWORD_SECRET: "${GRAYLOG_PASSWORD_SECRET:?Please configure GRAYLOG_PASSWORD_SECRET in the .env file}"
      GRAYLOG_ROOT_PASSWORD_SHA2: "${GRAYLOG_ROOT_PASSWORD_SHA2:?Please configure GRAYLOG_ROOT_PASSWORD_SHA2 in the .env file}"
      GRAYLOG_HTTP_BIND_ADDRESS: "0.0.0.0:9000"
      GRAYLOG_HTTP_EXTERNAL_URI: "http://localhost:9000/"
      GRAYLOG_MONGODB_URI: "mongodb://mongodb:27017/graylog"
    ports:
    - "5044:5044/tcp"   # Beats
    - "5140:5140/udp"   # Syslog
    - "5140:5140/tcp"   # Syslog
    - "5555:5555/tcp"   # RAW TCP
    - "5555:5555/udp"   # RAW UDP
    - "9000:9000/tcp"   # Server API
    - "12201:12201/tcp" # GELF TCP
    - "12201:12201/udp" # GELF UDP
    #- "10000:10000/tcp" # Custom TCP port
    #- "10000:10000/udp" # Custom UDP port
    - "13301:13301/tcp" # Forwarder data
    - "13302:13302/tcp" # Forwarder config
    networks:
      - graylog
    volumes:
      - "./volumes/graylog/usr/share/graylog/data/data:/usr/share/graylog/data/data" 
    restart: "on-failure"

networks:
  graylog:
    driver: "bridge"

  1. 增加 .env文件,这是新版本必须要的文件,里面的参数详情参考官方文档,后面的博文中也会进行一步步介绍。
vi .env
# You MUST set a secret to secure/pepper the stored user passwords here. Use at least 64 characters.
# Generate one by using for example: pwgen -N 1 -s 96
# ATTENTION: This value must be the same on all Graylog nodes in the cluster.
# Changing this value after installation will render all user sessions and encrypted values in the database invalid. (e.g. encrypted access tokens)
GRAYLOG_PASSWORD_SECRET="aB3cD9eF7gH2jK5mLpQwRtXvZx8sWn2kPmLrTv9hYqWeJkLmNpRfGtHsUjVnKdQw"

# You MUST specify a hash password for the root user (which you only need to initially set up the
# system and in case you lose connectivity to your authentication backend)
# This password cannot be changed using the API or via the web interface. If you need to change it,
# modify it in this file.
# Create one by using for example: echo -n yourpassword | shasum -a 256
# and put the resulting hash value into the following line
# CHANGE THIS!
GRAYLOG_ROOT_PASSWORD_SHA2="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918"
  1. 由于 .env 是隐藏文件,可以通过 ll -a 命令进行查看

启动docker-compose

  1. 执行命令 docker-compose up 进行启动
  2. 首先会进行镜像拉取,国内的镜像,大概2分钟左右镜像拉取完成
  3. 执行命令 docker-compose ps 查看容器拉取信息
  4. 到这里我们就已经把Graylog成功的启动起来啦。

问题处理(挂载权限问题)

  1. 执行 docker-compose ps 可以看到有两个容器一直在重启
  2. 执行命令查看日志:docker logs graylog-graylog-1
  3. 在docker-compose.yaml目录下执行权限修复命令,这是挂载目录权限问题导致宿主机没有权限。
chmod -R 777 ./volumes/graylog/usr/share/graylog/data/data
  1. 再执行命令停止:docker-compose down -v
  2. 最后执行重新启动:docker-compose up

问题处理(/proc/sys/vm/max_map_count)

  1. 执行命令查看日志:docker logs graylog-datanode-1
  2. 问题描述: 从日志来看,Graylog 启动失败的原因是系统参数 /proc/sys/vm/max_map_count 的值太低(当前为 65530),而 Graylog 要求至少为 262144,因为它们对内存映射区域有较高的需求。
  3. 问题修复:vi /etc/sysctl.conf
  4. 再末尾加上:vm.max_map_count=262144
  5. 保存并退出,然后应用更改:sudo sysctl -p
  6. 再执行命令停止:docker-compose down -v
  7. 最后执行重新启动:docker-compose up

三、Graylog初始化

密码获取

  1. 打开浏览器访问,IP+9000端口,如博主的:http://11.0.1.180:9000/
  2. 用户名为:admin
  3. 密码为:anQlBkYzlv ,密码获取查看docker日志:docker logs graylog-graylog-1

应用初始化

  1. CA证书初始化
  2. 自动30天需求,点击下一步
  3. 进行节点认证及初始化操作
  4. 点击进行重启
  5. 重启完成后,默认跳转登录页面,账号密码均为 admin
  6. 到这里就成功登录进去并访问首页

四、Graylog配置

  1. 点击System input 进行创建
  2. 选择 GELF UDP 进行创建 在这里插入图片描述
  3. 选中Global,并填入Title
  4. 点击Set-up Input ,点击Next
  5. 当状态显示为running时表示配置成功

五、SpringBoot项目集成应用

增加 pom.xml依赖

<dependency>
    <groupId>biz.paluch.logging</groupId>
    <artifactId>logstash-gelf</artifactId>
    <version>1.11.1</version>
</dependency>

增加 logback-spring.xml 配置文件

  1. 在原有的 logback-spring.xml 文件中加入配置文件
<appender name="GELF" class="biz.paluch.logging.gelf.logback.GelfLogbackAppender">
        <host>udp:11.0.1.180</host><!--graylog 服务器ip-->
        <port>12201</port><!--graylog udp端口-->
        <version>1.1</version>
        <facility>dify-server</facility>
        <extractStackTrace>true</extractStackTrace>
        <filterStackTrace>true</filterStackTrace>
        <mdcProfiling>true</mdcProfiling>
        <timestampPattern>yyyy-MM-dd HH:mm:ss,SSSS</timestampPattern>
        <maximumMessageSize>8192</maximumMessageSize>

        <!-- This are fields using MDC -->
        <mdcFields>portal_2_uid,query,conversationId,userId,searchType</mdcFields>
        <dynamicMdcFields>portal_2_uid.*,(mdc|MDC)fields</dynamicMdcFields>
        <includeFullMdc>true</includeFullMdc>
    </appender>
 <!-- 根日志. -->
    <root level="${LOG-LEVEL}">
        <appender-ref ref="consoleLog" />
        <appender-ref ref="infoLog" />
        <appender-ref ref="errorLog" />
        <appender-ref ref="GELF" />
    </root>
  1. 新增调试控制器
@Slf4j
@RestController
public class HealthyController {

    @GetMapping("/check")
    public Mono<HttpResult> check() {

        log.info("处理->健康检查");
        log.error("处理->健康检查完成");
        // 使用 Mono 包装返回值
        return Mono.just(HttpResult.successView());
    }
}

参数详解

参数含义
hostGraylog 地址及协议(UDP/TCP)
portGraylog 监听的 GELF 端口
versionGELF 版本号
facility应用标识
extractStackTrace是否提取异常堆栈
filterStackTrace是否优化堆栈信息
mdcProfiling是否启用 MDC 性能分析
timestampPattern时间戳格式
maximumMessageSize单条日志最大长度
mdcFields显式指定要发送的 MDC 字段
dynamicMdcFields动态匹配 MDC 字段
includeFullMdc是否发送全部 MDC 数据

六、效果展示

  1. 启动我们的SpringBoot项目
  2. 访问我们的应用地址,如:http://192.168.0.112:8077/dify/check
  3. 访问Graylog 首页,查看日志是否正常写入 在这里插入图片描述

七、总结

  1. 到目前为止,我们基本完成Graylog的容器部署,Graylog的初始化及我们的SpringBoot项目的集成
  2. 其实还有很多很多问题,比如这是单机的、我们演示的是UDP的,这个协议没有TCP可靠、还有集成的日志时间也是不对的,需要改成东八区,
  3. 差不多还有很多很多需要优化的地方,包括一些配置解释,这里只讲了最基础的集成应用,让大家有个直观的感受,后面会继续更新这个系列。