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。 ![暂无图片](https://cxx0822.iepose.cn/rustfs/blog/d29ddbd369e32cb7c2770464e8d0a142.png 'API查看日志.png') -# 四、自定义日志告警服务 +# 五、自定义日志告警服务 ![暂无图片](https://cxx0822.iepose.cn/rustfs/blog/74d5efdb80f506395b81988258433d9d.png '日志框架.png')   基本原理为通过提供一个HTTP的API接口,当Openobserver触发告警时,调用该接口,并传入当前的alert_name和timestamp,然后根据timestamp和Openobserver提供的API接口去查询最近一段时间内的所有日志信息,并存储到SqLite数据库中。同时也可以选择是否同步推送到企业微信和邮箱。   最后也需要提供一个查询历史日志告警信息的接口,并可视化显示,方便运维和开发查看。