hadoop - 根据日志级别写入HDFS

标签 hadoop log4j hdfs apache-kafka apache-storm

我正在使用HDFS bolt 将日志消息写入HDFS。现在,所有具有不同日志级别(如WARN,DEBUG,INFO,ERROR)的日志消息都将写入同一文件。如何在HDFS中的一个文件中写入INFO消息,在另一个文件中写入WARN消息,在另一个文件中单独写入ERROR消息?我正在使用log4j Kafka附加程序。基本上,我需要根据INFO,ERROR和DEBUG等日志级别将日志消息写入不同的文件,

最佳答案

直接的解决方案应该是使用四个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中都配置为自己的文件。

关于hadoop - 根据日志级别写入HDFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35449970/

相关文章:

scala - 如何防止Hadoop的HDFS API创建父目录?

python - MRJob 相同的 key 被发送到不同的 reducer

hadoop - 如何获取hbase行的所有版本

java - Servlet 应用程序中没有加载任何属性文件

java - log4j:当日志大小超过定义的阈值时,旋转日志

hadoop - Hive 在引用的字段中加载带逗号的 CSV

hadoop - 通过 Java 代码从本地计算机连接 AWS EMR 上的 HDFS

hadoop - Cloudera Manager 有什么替代方案吗? (CDH)

java - Servlet尝试运行Hadoop 2.2.0 MapReduce作业时发生异常

java - 避免由于 Log4j 中的默认行为而多次记录同一消息