Log4J Appender直接写到Flume

使用log4j Appender输出日志到Flume Agent 的avro source上。使用的时候log4j客户端必须要在classpath引入flume-ng-sdk(比如:flume-ng-sdk-1.8.0.jar).必需的参数已用 粗体 标明。

提示

说白了就是用log4j直接将日志内容发送到Flume,简化了先写入到日志,再由Flume收集的过程。


属性

默认值

解释

Hostname



远程运行着avro source的Flume Agent的hostname

Port



上面这个Flume Agent 的avro source监听的端口

UnsafeMode

false

如果为true,log4j的appender在发送Event失败时不会抛出异常

AvroReflectionEnabled

false

是否使用Avro反射来序列化log4j的Event(当log是字符串时不要开启)

AvroSchemaUrl



一个能检索到Avro结构的url

log4j.properties 文件配置范例:

  1. #...
  2. log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender
  3. log4j.appender.flume.Hostname = example.com
  4. log4j.appender.flume.Port = 41414
  5. log4j.appender.flume.UnsafeMode = true
  6.  
  7. # 指定一个类的logger输出到Flume appender上
  8. log4j.logger.org.example.MyClass = DEBUG,flume
  9. #...

默认情况下,每一个Event都会通过调用 toString()方法或者log4j的layout(如果配置了的话)转换成一个字符串。

如果Event是 org.apache.avro.generic.GenericRecordorg.apache.avro.specific.SpecificRecord 的一个实例,又或者 AvroReflectionEnabled 属性设置为 true ,Event会使用Avro序列化器来序列化。

使用Avro序列化每个Event效率很低,因此最好提供一个avro schema的URL,可以被 downstream sink(通常是HDFS sink)从该URL检索schema。 如果未指定 AvroSchemaUrl,则schema将作为Flume header包含在内。

使用Avro序列化Event的log4j.properties配置范例:

  1. #...
  2. log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender
  3. log4j.appender.flume.Hostname = example.com
  4. log4j.appender.flume.Port = 41414
  5. log4j.appender.flume.AvroReflectionEnabled = true
  6. log4j.appender.flume.AvroSchemaUrl = hdfs://namenode/path/to/schema.avsc
  7.  
  8. # 指定一个类的logger输出到flume appender上
  9. log4j.logger.org.example.MyClass = DEBUG,flume
  10. #...