2016-02-17 76 views
0

我使用HDFS bolt將日誌消息寫入HDFS。現在,具有不同日誌級別(如WARN,DEBUG,INFO,ERROR)的所有日誌消息都將寫入相同的文件。如何在一個文件中寫入INFO消息,在另一個文件中是WARN消息,在HDFS中是否只有一個文件中出現ERROR消息?我正在使用log4j Kafka appender。基本上我需要根據日誌級別(如INFO,ERROR和DEBUG)將日誌消息寫入不同的文件。根據日誌級別寫入HDFS

回答

0

直接的解決方案應該是使用四個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中。

+0

是的,或者你可以寫一個單一的螺栓來完成所有這些。 –