Fluentd配置问题:如何提取log字段发送至远程Syslog服务器
问题排查与配置修正
错误原因分析
你遇到的"log does not exist"错误,核心问题是日志解析环节错误:
- 原
source配置中使用了<parse> @type none</parse>,这会让Fluentd把每条日志行当成纯字符串,而非解析成JSON结构。此时事件记录里根本没有log字段,只有一个message字段存储完整的JSON字符串。 - 后续的
filter试图解析不存在的log字段,自然触发报错。
同时,原配置没有正确提取log字段的内容,导致发送的是完整JSON结构而非原始日志字符串。
修正后的Fluentd配置
<source> @type tail path "/var/log/containers/my_application*default*demo*.log" pos_file "/var/log/my_app.log.pos" read_from_head true tag "app-development" <parse> @type json time_key time time_format "%Y-%m-%dT%H:%M:%S.%NZ" </parse> </source> <match app-development> @type remote_syslog @id out_kube_remote_syslog host "#{ENV['SYSLOG_HOST']}" port "#{ENV['SYSLOG_PORT']}" severity debug program app-development_p hostname ${kubernetes_host} facility daemon message_key log # 关键:指定发送log字段的原始内容 protocol "#{ENV['SYSLOG_PROTOCOL'] || 'tcp'}" tls "#{ENV['SYSLOG_TLS'] || 'false'}" ca_file "#{ENV['SYSLOG_CA_FILE'] || ''}" verify_mode "#{ENV['SYSLOG_VERIFY_MODE'] || ''}" packet_size 65535 <buffer kubernetes_host> </buffer> <system> file_permission 666 </system> </match>
关键修改说明
修复日志解析
将source中的parse类型改为json,Fluentd会自动把日志行的JSON字符串解析为包含log、stream、time的结构化记录。同时配置time_key和time_format,让Fluentd使用日志自带的时间戳作为事件时间,更准确。移除错误的filter
原filter完全冗余且错误,直接删除即可——日志解析已在source环节完成,无需再用parserfilter处理不存在的字段。指定发送内容
在match配置中添加message_key log,告诉remote_syslog插件直接发送记录中的log字段内容,而非默认的message字段,这样就会把原始日志字符串发送到Syslog服务器。
可选:用record_transformer做字段精简
如果需要删除冗余字段(如stream、time),可以添加record_transformer filter:
<filter app-development> @type record_transformer # 将message字段设为log字段的值(兼容默认发送逻辑) <record> message ${record["log"]} </record> # 删除不需要的字段 remove_keys stream,time </filter>
这种情况下,match部分无需配置message_key,因为插件默认发送message字段。
内容的提问来源于stack exchange,提问作者user1452759
相关产品推荐
相关产品推荐

