我正在尝试设置数据管道,其中应用程序服务器通过网络发送(使用log4j日志记录)logevents(使用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
答案 0 :(得分:0)
如果您使用的是AvroSource,实际上是Avro RPC实现,这实际上非常简单。当您在客户端上创建Flume Events时,只需确保向您添加自定义标头包含您要使用的值的事件,例如发件人IP。不要使用拦截器,因为那些拦截器会使用执行拦截器的flume代理程序覆盖标头中的主机地址。您可以使用以下语法%{header_key}
访问flume配置中标头的值答案 1 :(得分:0)
对于有类似问题的人,我最终在应用程序端删除了log4j-flume appender,将其替换为log4j-syslog appender。 在水槽方面我配置了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 agent,syslogudp source
A1.sources.logMR.type = syslogudp
A1.sources.logMR.bind = 0.0.0.0
A1.sources.logMR.port = 41473
所以现在我的水槽事件看起来像,
2015-03-17 08:43:02,658 INFO org.apache.flume.sink.LoggerSink:事件:{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}
访问标题中的主机密钥了