我正在使用HDFS bolt将日志消息写入HDFS。现在,所有具有不同日志级别的日志消息(如WARN,DEBUG,INFO,ERROR)都写入同一文件。如何在一个文件中编写INFO消息,在另一个文件中编写WARN消息,在HDFS中的另一个文件中单独写入ERROR消息?我正在使用log4j Kafka appender。基本上我需要根据日志级别(如INFO,ERROR和DEBUG)将日志消息写入不同的文件。
答案 0 :(得分: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中自己的文件。