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

二、Graylog一键部署
docker-compose安装
Graylog部署
官方安装文档
- 官方部署文档:go2docs.graylog.org/current/dow...
- GitHub yaml文件:github.com/Graylog2/do...

博主自定义yaml
- 建议大家先参考官方文档了解docker-compose里面的文件,博主对yaml进行了小的改动,比如镜像使用了国内的镜像源、把挂载卷去掉了,默认在docker-compose.yaml目录进行持久化至宿主机;
- 执行以下代码进行部署:
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"
- 增加 .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"
- 由于 .env 是隐藏文件,可以通过
ll -a
命令进行查看
启动docker-compose
- 执行命令
docker-compose up
进行启动 - 首先会进行镜像拉取,国内的镜像,大概2分钟左右镜像拉取完成
- 执行命令
docker-compose ps
查看容器拉取信息 - 到这里我们就已经把Graylog成功的启动起来啦。
问题处理(挂载权限问题)
- 执行
docker-compose ps
可以看到有两个容器一直在重启 - 执行命令查看日志:
docker logs graylog-graylog-1
- 在docker-compose.yaml目录下执行权限修复命令,这是挂载目录权限问题导致宿主机没有权限。
bash
chmod -R 777 ./volumes/graylog/usr/share/graylog/data/data
- 再执行命令停止:
docker-compose down -v
- 最后执行重新启动:
docker-compose up
问题处理(/proc/sys/vm/max_map_count)
- 执行命令查看日志:
docker logs graylog-datanode-1
- 问题描述: 从日志来看,Graylog 启动失败的原因是系统参数 /proc/sys/vm/max_map_count 的值太低(当前为 65530),而 Graylog 要求至少为 262144,因为它们对内存映射区域有较高的需求。
- 问题修复:
vi /etc/sysctl.conf
- 再末尾加上:
vm.max_map_count=262144
- 保存并退出,然后应用更改:
sudo sysctl -p
- 再执行命令停止:
docker-compose down -v
- 最后执行重新启动:
docker-compose up
三、Graylog初始化
密码获取
- 打开浏览器访问,IP+9000端口,如博主的:http://11.0.1.180:9000/
- 用户名为:admin
- 密码为:anQlBkYzlv ,密码获取查看docker日志:
docker logs graylog-graylog-1
应用初始化
- CA证书初始化
- 自动30天需求,点击下一步
- 进行节点认证及初始化操作
- 点击进行重启
- 重启完成后,默认跳转登录页面,账号密码均为 admin
- 到这里就成功登录进去并访问首页
四、Graylog配置
- 点击System input 进行创建
- 选择 GELF UDP 进行创建
- 选中Global,并填入Title
- 点击Set-up Input ,点击Next
- 当状态显示为running时表示配置成功
五、SpringBoot项目集成应用
增加 pom.xml依赖
xml
<dependency>
<groupId>biz.paluch.logging</groupId>
<artifactId>logstash-gelf</artifactId>
<version>1.11.1</version>
</dependency>
增加 logback-spring.xml 配置文件
- 在原有的 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>
- 新增调试控制器
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 数据 |
六、效果展示
- 启动我们的SpringBoot项目
- 访问我们的应用地址,如:http://192.168.0.112:8077/dify/check
- 访问Graylog 首页,查看日志是否正常写入
七、总结
- 到目前为止,我们基本完成Graylog的容器部署,Graylog的初始化及我们的SpringBoot项目的集成
- 其实还有很多很多问题,比如这是单机的、我们演示的是UDP的,这个协议没有TCP可靠、还有集成的日志时间也是不对的,需要改成东八区,
- 差不多还有很多很多需要优化的地方,包括一些配置解释,这里只讲了最基础的集成应用,让大家有个直观的感受,后面会继续更新这个系列。