Apache Storm:度量标准日志文件为空

时间:2016-04-25 13:41:19

标签: logging apache-storm log4j2 metrics

我想按照这里的例子

https://www.endgame.com/blog/storm-metrics-how

这是我的storm.yaml

storm.zookeeper.servers:
- localhost


supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
- 6704


nimbus.host: localhost

ui.port: 8080
ui.host: localhost

storm.log.dir: /path/to/storm/logdir

topology.max.spout.pending: 5000

我尝试在本地和群集模式下运行拓扑。 metrics.log文件是在/path/to/storm/logdir位置创建的,但该文件为空!我错过了一些配置吗?

1 个答案:

答案 0 :(得分:1)

问题在于当前 log4j2 设置风暴中的度量标准,修复有点牵扯。

问题

首先让我列出Storm的Jira的一些错误。通过指标记录,阅读问题和解决方案可以解决当前的问题:

总结上述情况:

  • cluster.xml中定义指标记录器不正确,因为工作记录程序(记录指标的位置)是使用worker.xml定义的。因此,工作人员可能无法访问指标记录器定义。它还会产生文件所有权问题 - 第一个记录指标的工作人员将拥有该日志文件,以防止其他工作程序中的其他记录程序附加到指标日志文件。
  • 将软件包从backtype.storm.metric重命名为org.apache.storm.metric后,软件包重命名为worker.xml个文件。
  • 最后,指标记录器名为org.apache.storm.metric.LoggingMetricsConsumer,这意味着当尝试使用LoggerFactory.getLogger(LoggingMetricsConsumer.class)类中的LoggingMetricsConsumer创建它时,实际创建的记录器是附加到 ROOT 记录器并使用A1 appender而不是METRICS appender。

修复

我的实际修复涉及两件事(请注意第一步是可选的)

  1. 可选择在worker.xmlcluster.xml文件中整理 log4j2 设置。
    只需确保您的日志记录设置具有worker.xml中定义的指标记录器,就像在此github commit for Storm project fixing the STORM-1673 issue (which has made it to 1.0.0 and 2.0.0)中一样。相反,请确保不再在cluster.xml文件中定义指标记录器。

  2. 重命名指标记录器并分叉LoggingMetricsConsumer类,将其指向新重命名的记录器(未连接到 root 记录器):

    首先确保worker.xml文件中的指标记录器不再命名为org.apache.storm.metric.LoggingMetricsConsumer,但请根据此代码段说明METRICS_LOGGER

    <Logger name="METRICS_LOGGER" level="info" additivity="false">
        <appender-ref ref="METRICS"/>
    </Logger>
    
    来自同一github commit as above


    其次“fork”LoggingMetricsConsumer类。
    请注意 fork 我的意思是将其源代码引入您的项目以便修改它所需的一切。您可以定义自己的实现IMetricsConsumer的类,只要您将其附加到拓扑中即可。拥有自己的LoggingMetricsConsumer课程后,您必须修改其创建指标记录器的方式:

    public static final Logger METRICS_LOG = LoggerFactory.getLogger("METRICS_LOGGER");

  3. 最后请注意,如果您使用的Storm版本不是1.0.0或2.0.0

    只需确保从您的版本中删除的git分支中查看LoggingMetricsConsumer源代码以及worker.xmlcluster.xml的版本。此区域已经发生了很大变化,每个更改都不向后兼容(包重命名,记录器移动)。