Hadoop提供了日志审计功能,可以记录对hdfs的操作,包括创建文件、上传文件、删除文件等。在某个业务场景中,我们期望将hdfs的操作日志记录到日志平台中,日志平台基于Kafka实现,因此需要将日志发送到Kafka中。
首先继承log4j的AppenderSkeleton实现自定义的appender:
@Data
public class DcLog4jAppender extends AppenderSkeleton {
private String code;
private String dcKafkaUrl;
private KafkaAppender kafkaAppender;
@Override
public void activateOptions(){
super.activateOptions();
kafkaAppender = new KafkaAppender(code, dataCenter, dcKafkaUrl);
kafkaAppender.initTopic();
}
@Override
protected void append(LoggingEvent event) {
kafkaAppender.sendMsg(event.getMessage().toString());
}
@Override
public void close() {
kafkaAppender.stop();
}
@Override
public boolean requiresLayout() {
return false;
}
}
类中的KafkaAppender是对KafkaProducer的封装,其中完成了KafkaProducer的初始化以及数据发送等操作。
修改Hadoop路径下的log4j.properties文件,首先添加自定义的appender:
log4j.appender.dcKafkaAppender=cn.taofu.dclog.appender.DcLog4jAppender
log4j.appender.dcKafkaAppender.code=vHmplP
log4j.appender.dcKafkaAppender.dcKafkaUrl=dp81:9092,dp82:9092,dp83:9092
接下来添加dcKafkaAppender到audit的logger中:
log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=${hdfs.audit.logger},dcKafkaAppender
通过查看FSNamesystem的源码可以发现该类的auditLog定义的logger名即为FSNamesystem.class.getName()+".audit"。
在CM中配置时,在NameNode日志记录高级配置代码段中添加以上配置即可。
配置完成后,重启DataNode,进行hdfs操控(新建、查询、删除)时,日志即可发送到Kafka中。