From 94c1157260bf6b0f542d78ac3af53f27d72f9224 Mon Sep 17 00:00:00 2001
From: Cxx0822 <1556464090@qq.com>
Date: Tue, 21 Apr 2026 20:02:23 +0800
Subject: [PATCH] =?UTF-8?q?feat:=E6=9B=B4=E6=96=B0fluentbit=E6=96=87?=
=?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/DevOps/OpenObserve.md | 423 ++++++++++++++++++++++++++++++++++++-
1 file changed, 419 insertions(+), 4 deletions(-)
diff --git a/docs/DevOps/OpenObserve.md b/docs/DevOps/OpenObserve.md
index 515d2ab..83eabe2 100644
--- a/docs/DevOps/OpenObserve.md
+++ b/docs/DevOps/OpenObserve.md
@@ -23,7 +23,7 @@ Fluent Bit 的功能通过“插件”来扩展。
3. Output(输出)
定义数据目的地,例如 Elasticsearch、Splunk、Kafka、Datadog、Loki、S3、另一个 Fluentd/Fluent Bit 实例等。
-### 1.1.3 核心架构与数据流
+### 1.1.3 核心架构
1. Input(输入)
一个或多个输入插件持续地从数据源收集数据。每条数据被读入后,会带上时间戳和标签等信息,被包装成一个内部的事件记录。
2. Parser(解析器)
@@ -95,7 +95,7 @@ volumes:
driver: local
```
- fluent bit配置文件:
+ fluent bit配置文件fluent-bit.conf:
```conf
[SERVICE]
Flush 5
@@ -125,7 +125,422 @@ volumes:
INPUT为日志输入源,监听24422端口。
OUTPUT为日志输出源,将日志发送到openobserve中(这里使用的是容器名称),URI表示openobserve接收数据的api路径,default/default表示组织名称/流名称,可以更改为其他的名称。_json表示以json的格式。
-# 三、简单使用
+# 三、数据接入
+## 3.1 SpringBoot
+### 3.1.1 安装依赖
+```xml
+
+ 1.8.8
+ 2.7.0
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+ com.sndyuk
+ logback-more-appenders
+ ${logback-more-appenders.version}
+
+
+
+ org.komamitsu
+ fluency-fluentd
+ ${fluency-fluentd.version}
+
+
+```
+
+### 3.1.2 日志配置
+```yml
+logging:
+ config: classpath:logback-spring.xml
+ fluentd:
+ host: host.docker.internal
+ port: 24224
+ level:
+ root: info
+```
+
+### 3.1.3 配置文件
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DEBUG
+
+
+
+ ${CONSOLE_LOG_PATTERN}
+
+ ${ENCODING}
+
+
+
+
+
+
+
+ INFO
+ ACCEPT
+ DENY
+
+
+ ${log.path}/log_info.log
+
+ ${FILE_LOG_PATTERN}
+ ${ENCODING}
+
+
+
+
+ ${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+ 15
+
+
+
+
+
+
+ WARN
+ ACCEPT
+ DENY
+
+
+ ${log.path}/log_warn.log
+
+ ${FILE_LOG_PATTERN}
+ ${ENCODING}
+
+
+
+ ${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+ 15
+
+
+
+
+
+
+ ERROR
+ ACCEPT
+ DENY
+
+
+ ${log.path}/log_error.log
+
+ ${FILE_LOG_PATTERN}
+ ${ENCODING}
+
+
+
+ ${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+ 15
+
+
+
+
+
+ ${fluentdHost}
+ ${fluentdPort}
+
+ topic
+ ${topic}
+
+ caller
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+::: tip
+这里是用docker部署的,如果是非docker部署,host为服务器ip地址。
+:::
+
+## 3.2 .NET
+### 3.2.1 安装Nuget包
+ 安装NLog.Extensions.Hosting和NLog.Targets.Network包。
+
+::: tip
+NLog.Targets.Fluentd这个包也可以,但是无法定制FluentBit的消息格式。
+:::
+
+### 3.2.2 使用NLog
+```cs
+var host = Host.CreateDefaultBuilder(args)
+ .UseNLog()
+ .Build();
+```
+
+### 3.2.3 配置NLog
+ 在项目目录创建`NLog.config`并设置复制到输出目录为始终复制。
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+::: tip
+这里的topic为项目名称。
+:::
+
+### 3.2.3 配置fluentbit
+ NLog的network采用Tcp传输,需要在FluentBit中增加TCP接口:
+```conf
+[INPUT]
+ Name tcp
+ Listen 0.0.0.0
+ Port 5170
+ Tag tcp
+```
+
+::: tip
+docker-compose文件中也要增加5170端口映射。
+:::
+
+## 3.3 Python
+### 3.3.1 安装依赖
+```bash
+pip install fluent-logger
+```
+
+### 3.3.2 配置文件
+```.env
+FLUENT_HOST=ip
+FLUENT_PORT=24224
+FLUENT_TAG=test-server
+```
+
+### 3.3.3 日志配置
+```py
+import logging
+from datetime import datetime
+from fluent import sender, event
+from dotenv import load_dotenv
+import os
+
+load_dotenv()
+
+# Fluent-bit配置
+FLUENT_HOST = os.getenv("FLUENT_HOST", "localhost")
+FLUENT_PORT = int(os.getenv("FLUENT_PORT", 24224))
+FLUENT_TAG = os.getenv("FLUENT_TAG", "default")
+
+
+class FluentHandler(logging.Handler):
+ """Fluent-bit日志处理器"""
+
+ def emit(self, record):
+ try:
+ log_data = {
+ "level": record.levelname,
+ "message": record.message,
+ "module": record.module,
+ "line": record.lineno,
+ "topic": FLUENT_TAG,
+ }
+ event.Event(record.levelname.lower(), log_data)
+ except Exception as e:
+ print(f"Fluent日志发送失败: {str(e)}")
+
+
+def setup_logger():
+ logger = logging.getLogger("app_logger")
+ logger.setLevel(logging.DEBUG)
+ logger.propagate = False # 防止日志重复输出
+
+ # 日志格式
+ formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s")
+
+ # 控制台处理器(所有环境启用)
+ console_handler = logging.StreamHandler()
+ console_handler.setFormatter(formatter)
+ console_handler.setLevel(logging.DEBUG)
+ logger.addHandler(console_handler)
+
+ # 输出到fluent-bit
+ sender.setup(FLUENT_TAG, host=FLUENT_HOST, port=FLUENT_PORT)
+ fluent_handler = FluentHandler()
+ fluent_handler.setFormatter(formatter)
+ fluent_handler.setLevel(logging.INFO)
+ logger.addHandler(fluent_handler)
+
+ return logger
+
+
+# 全局日志实例
+logger = setup_logger()
+```
+
+## 3.4 Unity
+### 3.4.1 日志配置
+```cs
+using UnityEngine;
+using UnityEngine.Networking;
+using System.Collections;
+using System;
+
+public class FluentBitLogger : MonoBehaviour
+{
+ private string url = "http://ip:9880";
+
+ void OnEnable() => Application.logMessageReceived += HandleLog;
+ void OnDisable() => Application.logMessageReceived -= HandleLog;
+
+ void HandleLog(string logString, string stackTrace, LogType type)
+ {
+ // 1. 准备数据
+ var logData = new LogData
+ {
+ topic = "default",
+ message = logString,
+ logType = type.ToString(),
+ timestamp = DateTime.Now.ToString("o")
+ };
+
+ // 2. 转 JSON 并发送
+ string json = JsonUtility.ToJson(logData);
+ StartCoroutine(Send(json));
+ }
+
+ IEnumerator Send(string json)
+ {
+ // 快速判断设备是否连接到互联网
+ if (Application.internetReachability == NetworkReachability.NotReachable)
+ {
+ yield break;
+ }
+
+ using (UnityWebRequest req = UnityWebRequest.Put(url, json))
+ {
+ req.method = "POST";
+ req.timeout = 1;
+ req.SetRequestHeader("Content-Type", "application/json");
+ yield return req.SendWebRequest();
+ }
+ }
+
+ [Serializable]
+ public class LogData
+ {
+ public string topic;
+ public string message;
+ public string logType;
+ public string timestamp;
+ }
+}
+```
+
+### 3.4.2 配置fluentbit
+ Unity日志采用http传输,需要在FluentBit中增加http接口:
+```conf
+[INPUT]
+ Name http
+ Listen 0.0.0.0
+ Port 9880
+ Tag unity.logs
+```
+
+::: tip
+docker-compose文件中也要增加9880端口映射。
+:::
+
+# 四、简单使用
## 3.1 配置数据流
打开控制台,选择数据流->添加数据流,输入fluent bit配置文件中的流名称,选择数据流类型为Logs。
在新添加的数据流中,点击查看,跳转到日志页面即可看到上次的日志信息。
@@ -235,7 +650,7 @@ curl -X 'POST' \
注意这里要加上Basic auth认证,并提供username和password。

-# 四、自定义日志告警服务
+# 五、自定义日志告警服务

基本原理为通过提供一个HTTP的API接口,当Openobserver触发告警时,调用该接口,并传入当前的alert_name和timestamp,然后根据timestamp和Openobserver提供的API接口去查询最近一段时间内的所有日志信息,并存储到SqLite数据库中。同时也可以选择是否同步推送到企业微信和邮箱。
最后也需要提供一个查询历史日志告警信息的接口,并可视化显示,方便运维和开发查看。