基于日志级别写入hdfs

fnx2tebb  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(294)

我正在使用hdfs-bolt将日志消息写入hdfs。现在,所有具有不同日志级别(如warn、debug、info、error)的日志消息都写入同一个文件。如何在一个文件中写入信息消息,在另一个文件中写入警告消息,在hdfs的另一个文件中单独写入错误消息?我正在使用log4jKafkaappender。基本上,我需要根据日志级别(如info、error和debug)将日志消息写入不同的文件中。,

gk7wooem

gk7wooem1#

直截了当的解决办法应该是使用四个 HdfsBolt 和一个附加的“logsplitbolt”发出四个输出流(每个日志级别一个):

public class LogSplitBolt {
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        Fields schema = new Fields(...);
        declarer.declareStream("debug", schema);
        declarer.declareStream("error", schema);
        declarer.declareStream("warnings", schema);
        declarer.declareStream("info", schema);
   }

   public void execute(Tuple input) {
       String logLevel = input.getXXX(...); // get log level
       // use logLevel as output streamId
       collector.emit(logLevel, new Values(input.getValues());
    }
}

构建拓扑时,不同的 HdfsBolt 订阅不同的流:

builder.addBolt("splitter", new LogSplitBolt());
builder.addbolt("writeDebug", new HdfsBolt(...)).localOfShuffle("debug", "splitter");
builder.addbolt("writeError", new HdfsBolt(...)).localOfShuffle("error", "splitter");
builder.addbolt("writeWarning", new HdfsBolt(...)).localOfShuffle("warning", "splitter");
builder.addbolt("writeInfo", new HdfsBolt(...)).localOfShuffle("info", "splitter");

当然,每个 HdfsBolt 在hdfs中配置为自己的文件。

相关问题