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

一、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. 执行以下代码进行部署:
bash 复制代码
mkdir -p /data/graylog
bash 复制代码
vi docker-compose.yaml
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文件,这是新版本必须要的文件,里面的参数详情参考官方文档,后面的博文中也会进行一步步介绍。
bash 复制代码
vi .env
bash 复制代码
# 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目录下执行权限修复命令,这是挂载目录权限问题导致宿主机没有权限。
bash 复制代码
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依赖

xml 复制代码
<dependency>
    <groupId>biz.paluch.logging</groupId>
    <artifactId>logstash-gelf</artifactId>
    <version>1.11.1</version>
</dependency>

增加 logback-spring.xml 配置文件

  1. 在原有的 logback-spring.xml 文件中加入配置文件
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>
xml 复制代码
 <!-- 根日志. -->
    <root level="${LOG-LEVEL}">
        <appender-ref ref="consoleLog" />
        <appender-ref ref="infoLog" />
        <appender-ref ref="errorLog" />
        <appender-ref ref="GELF" />
    </root>
  1. 新增调试控制器
java 复制代码
@Slf4j
@RestController
public class HealthyController {

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

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

参数详解

参数 含义
host Graylog 地址及协议(UDP/TCP)
port Graylog 监听的 GELF 端口
version GELF 版本号
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. 差不多还有很多很多需要优化的地方,包括一些配置解释,这里只讲了最基础的集成应用,让大家有个直观的感受,后面会继续更新这个系列。
相关推荐
ん贤1 小时前
如何加快golang编译速度
后端·golang·go
摸鱼仙人~3 小时前
Spring Boot 参数校验:@Valid 与 @Validated
java·spring boot·后端
思无邪66753 小时前
从零构建搜索引擎 build demo search engine from scratch
后端
Littlewith3 小时前
Node.js:创建第一个应用
服务器·开发语言·后端·学习·node.js
码间舞4 小时前
【面试官】:NodeJs事件循环你了解多少?我笑了,让我喝口水慢慢给你说来......
后端·node.js
itsoo4 小时前
2.5万字!一文搞懂稳定性建设要怎么做?
后端
一眼万年044 小时前
Nginx Master-Worker 进程间的共享内存是怎么做到通用还高效的?
后端·nginx·面试
小华同学ai4 小时前
惊喜! Github 10k+ star 的国产流程图框架,LogicFlow 能解你的图编辑痛点?
前端·后端·github
XuanXu4 小时前
MCP简单研究以及介绍
后端·ai编程·cursor
该用户已不存在4 小时前
我不管,我的 Claude Code 必须用上 Gemini 2.5 Pro
前端·人工智能·后端