flume : 找到事件发送者的 ip/hostname?
flume : find ip/hostname of event sender?
我正在尝试设置数据管道,其中应用程序服务器通过网络将(使用 log4j 日志记录)logevents 发送到 flume(使用 flume log4j appender),到 flume 的 avrosource代理正在使用
我尝试了以下配置,但它只附加了代理所在主机的 IP 运行
A1.sources.logE.interceptors = hostint
A1.sources.logE.interceptors.hostint.type = org.apache.flume.interceptor.HostInterceptor$Builder
A1.sources.logE.interceptors.hostint.preserveExisting = true
A11.sources.logE.interceptors.hostint.useIP = false
如果您使用 AvroSource,这实际上很容易,它实际上是一个 Avro RPC 实现。当您在客户端上创建 Flume 事件时,只需确保向包含您要使用的值的事件添加自定义 headers,例如发件人IP。不要使用拦截器,因为拦截器会用执行拦截器的 flume 代理覆盖 header 中的主机地址。您可以使用以下语法 %{header_key}
在 flume 配置中访问 header 的值
对于遇到类似问题的任何人,我最终删除了应用程序端的 log4j-flume appender,将其替换为 log4j-syslog appender。
在 flume 方面,我配置了 syslogudp 源。
所以最后它看起来像,
在应用程序端 log4j-config
log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
log4j.appender.syslog.Facility=LOCAL7
log4j.appender.syslog.FacilityPrinting=false
log4j.appender.syslog.Header=true
log4j.appender.syslog.SyslogHost=flume1.host.net:41473
log4j.appender.syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.syslog.layout.ConversionPattern= DUMMY %p: (%F:%L) %x %m %n
在 flume 代理,syslogudp 源
A1.sources.logMR.type = syslogudp
A1.sources.logMR.bind = 0.0.0.0
A1.sources.logMR.port = 41473
所以现在我的 flume 活动看起来像
2015-03-17 08:43:02,658 INFO org.apache.flume.sink.LoggerSink: Event: { headers:{timestamp=1426682579754, Severity=7, host=apphost1.host.net, Facility=23, log_type=maplogs} body: 54 4F 46 4C
55 4D 45 20 5B 6D 61 69 6E 2C 5D 20 TOFLUME [main,] }
我现在终于可以使用 %{host}
访问 header 中的主机密钥
我正在尝试设置数据管道,其中应用程序服务器通过网络将(使用 log4j 日志记录)logevents 发送到 flume(使用 flume log4j appender),到 flume 的 avrosource代理正在使用
我尝试了以下配置,但它只附加了代理所在主机的 IP 运行
A1.sources.logE.interceptors = hostint
A1.sources.logE.interceptors.hostint.type = org.apache.flume.interceptor.HostInterceptor$Builder
A1.sources.logE.interceptors.hostint.preserveExisting = true
A11.sources.logE.interceptors.hostint.useIP = false
如果您使用 AvroSource,这实际上很容易,它实际上是一个 Avro RPC 实现。当您在客户端上创建 Flume 事件时,只需确保向包含您要使用的值的事件添加自定义 headers,例如发件人IP。不要使用拦截器,因为拦截器会用执行拦截器的 flume 代理覆盖 header 中的主机地址。您可以使用以下语法 %{header_key}
在 flume 配置中访问 header 的值对于遇到类似问题的任何人,我最终删除了应用程序端的 log4j-flume appender,将其替换为 log4j-syslog appender。 在 flume 方面,我配置了 syslogudp 源。
所以最后它看起来像,
在应用程序端 log4j-config
log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
log4j.appender.syslog.Facility=LOCAL7
log4j.appender.syslog.FacilityPrinting=false
log4j.appender.syslog.Header=true
log4j.appender.syslog.SyslogHost=flume1.host.net:41473
log4j.appender.syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.syslog.layout.ConversionPattern= DUMMY %p: (%F:%L) %x %m %n
在 flume 代理,syslogudp 源
A1.sources.logMR.type = syslogudp
A1.sources.logMR.bind = 0.0.0.0
A1.sources.logMR.port = 41473
所以现在我的 flume 活动看起来像
2015-03-17 08:43:02,658 INFO org.apache.flume.sink.LoggerSink: Event: { headers:{timestamp=1426682579754, Severity=7, host=apphost1.host.net, Facility=23, log_type=maplogs} body: 54 4F 46 4C 55 4D 45 20 5B 6D 61 69 6E 2C 5D 20 TOFLUME [main,] }
我现在终于可以使用 %{host}
访问 header 中的主机密钥