【问题标题】:How to write logs to a file using Log4j and Storm Framework?如何使用 Log4j 和 Storm Framework 将日志写入文件?
【发布时间】:2014-09-05 06:41:00
【问题描述】:

我在 Storm 中使用 log4j 登录文件时遇到了一点问题。

在提交我的拓扑之前,即在我的主要方法中,我编写了一些日志语句并使用以下配置记录器:

PropertyConfigurator.configure(myLog4jProperties)
  • 现在,当我在 eclipse 中使用 executable jar 运行拓扑时 - 它工作正常,并且正在按预期创建日志文件。

    当我使用“java -jar MyJarFile”运行我的可执行 jar someOtherOptions”,我可以看到正在配置 log4j 并且文件是 格式正确,并且在文件和控制台上都完成了日志记录(如 在我的 log4j.properties 中定义)

  • 但是当我使用“storm jar MyJarFile MyMainClass someOtherOptions”运行同一个 jar 时,它无法创建和记录 进入除控制台以外的任何文件。

我说的是我在在提交拓扑之前打印的日志。

在使用storm时有什么方法可以将我的语句记录在一个文件中?我一定要使用 org.apache.log4j

【问题讨论】:

  • 您正在使用本地集群作为 jar exec?当您使用“storm jar ...”时,您使用的是集群模式。那么,您是否检查了服务器中storm install dir/log4j 上的文件storm.log.properties?当您以集群模式提交拓扑时,storm 已经在运行并正在写入日志,也许您无法在运行时覆盖 log4j,因此之前修改storm log4j 文件应该适用于所有情况。
  • @zenbeni 我实际上是在本地模式下运行的。我在 Storm 安装目录中找不到任何与 log4j 相关的属性。我正在使用 apache-storm-0.9.2-incubating。

标签: java logging log4j slf4j apache-storm


【解决方案1】:

storm 框架使用自己的日志记录。您的日志很可能最终会出现在安装了storm 的日志目录中({Storm DIR}/logs)。您可以在 {Storm DIR}/logback/cluster.xml 中找到风暴日志属性。它使用 logback 而不是 log4j

【讨论】:

  • 此文件定义了 apache-storm-incubating-0.9.2.jar 中文件的属性。当然,我可以为此更改属性。但我想更改 MyJarFile.jar 的日志记录属性。 cluster.xml 不会影响其日志记录。而且我还可以为提交拓扑后打印的日志定义属性,即在主管节点上。在提交拓扑之前,我无法将日志(存在于 MyJarFile.jar 中)打印到文件中。
  • 如何在 slf4j jar 上使用 log4j?
【解决方案2】:

我建议使用 SLF4J 在storm 中进行日志记录。您可能可以让 LOG4J 工作,但您将在集群中的每个节点上进行额外的设置。由于storm已经为你做了这个,我真的不明白这一点。

在您的项目中,包含这些 maven 依赖项(用于您的单元测试的 slf4j-simple!):

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.5</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.5</version>
  <scope>test</scope>
</dependency>

然后,在您的拓扑/spouts/bolts 中,您将获得 Logger:

private static final Logger LOG = LoggerFactory.getLogger(MySpout.class);

在我的环境中,任何 INFO 及以上内容都会记录到文件中,更重要的是,在 Storm UI 中可见。您只需单击您的 spout/bolt,然后单击端口号即可转到日志查看器页面。

如果您想获取实际文件,则可以从每个节点收集它们(我的在 /var/log/storm/)。

【讨论】:

  • 因此,当您说“获取实际文件”时,您是在说 worker-.log 文件,这些文件默认进入 $STORM_HOME/logs 目录。或者你的意思是说你配置了你的 log4j 文件,路径为 /var/log/storm ?此外,Storm 有什么方法可以不使用 Cluster.xml 并使用您在部署到集群的 jar 中发送的日志文件。
  • @AnkurGarg 我的意思是worker-port.log 文件。每当您在拓扑中调用 LOG.info 或更高版本时,它将被记录到这些工作日志中并在 Storm UI 中可见。
  • 好的。感谢您回复 Kit :)
  • 我的问题是我在 master 上运行了大约 10 个应用程序。每次我想获取应用程序的日志文件时,我都必须转到每个节点,搜索端口以获取 worker-xxx.log。有没有办法为每个应用程序配置日志名称?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多