如何解决Python通过TCP向Fluent-Bit输出日志的异常问题?
Python与Fluent-Bit TCP输入集成问题解决方法
问题场景
尝试通过Python模块将日志导出到Fluent-Bit的TCP输入服务器,配置逻辑如下:
- Python使用
SocketHandler将日志发送到本地5170端口 - Fluent-Bit配置TCP监听5170端口,最终将日志输出到本地文件
实际测试中遇到两个核心问题:
- 当Fluent-Bit的TCP输入
format设为json时,抛出警告:[2022/07/21 10:12:56] [ warn] [input:tcp:tcp.0] invalid JSON message, skipping - 当
format设为none时,出现调试日志:[2022/07/21 10:07:46] [debug] [input chunk] skip ingesting data with 0 bytes
错误原因分析
- Python代码格式化配置错误:
- 错误引用
self.format(无类实例场景下应直接使用定义的格式化变量) - 全局给
logger设置Formatter,而非给socket_handler单独配置,导致格式化规则未生效
- 错误引用
- 日志消息缺少分隔符:
Fluent-Bit的TCP输入默认按换行符拆分日志消息,缺少换行符会导致服务无法识别单条日志,甚至判定为0字节无效数据 - 日志级别未明确设置:
Python logger默认级别为WARNING,未显式设置INFO级别时,logger.info()的日志不会被发送
修复步骤
1. 修正Python代码
import logging from logging.handlers import SocketHandler from pythonjsonlogger import jsonlogger # 定义日志格式字符串 log_format = '%(asctime)s [%(levelname)s] %(funcName)s %(process)d %(message)s' # 初始化logger,替换为实际模块名 logger = logging.getLogger("your_module_name") # 显式设置日志级别,确保INFO级日志能被输出 logger.setLevel(logging.INFO) # 自定义带换行的JSON格式化器,解决Fluent-Bit消息分隔问题 class NewlineJsonFormatter(jsonlogger.JsonFormatter): def format(self, record): return super().format(record) + '\n' # 创建SocketHandler,绑定到Fluent-Bit的TCP端口 socket_handler = SocketHandler("localhost", 5170) # 给SocketHandler单独配置格式化器 socket_handler.setFormatter(NewlineJsonFormatter(log_format)) # 将handler添加到logger logger.addHandler(socket_handler) # 测试日志发送 logger.info("Hello Log!")
2. 调整Fluent-Bit配置(fluent-bit.conf)
[SERVICE] Flush 1 Grace 30 Log_Level info Parsers_File parsers.conf [INPUT] Name tcp Tag ApplicationLogs Listen 0.0.0.0 Port 5170 Chunk_Size 1024 Buffer_Size 10024 format json # 明确指定输入格式为JSON [OUTPUT] Name file Match ApplicationLogs Path /tmp/fluent-test-output.logs
关键修复点说明
- 给
logger设置明确的INFO级别,确保目标日志能被发送 - 给
SocketHandler单独配置Formatter,避免全局配置冲突 - 添加换行符确保Fluent-Bit能正确拆分每条日志消息
- 明确Fluent-Bit输入格式为JSON,匹配Python发送的日志结构
验证结果
运行修改后的Python代码,查看/tmp/fluent-test-output.logs文件,应能看到格式化后的JSON日志:
{"asctime": "2022-07-21 14:30:00,123", "levelname": "INFO", "funcName": "<module>", "process": 12345, "message": "Hello Log!"}
内容的提问来源于stack exchange,提问作者Sarriman
相关产品推荐
相关产品推荐

