2015-08-31 94 views
1

出于测试目的,我希望在WebSphere Application Server上以本地模式运行Spark。问题是,只要初始化本地火花上下文,它就会通过Spark记录器重定向所有日志记录在WebSphere服务器中。Apache Spark日志重定向WebSphere日志输出

我的意思是“重定向”是:根据WebSphere日志,所有日志行均无例外地且无论哪个WebSphere组件或应用程序被记录到SystemErr。在每条记录的消息上,您可以看到另一个时间戳记以及实际日志消息之前的日志级别和记录器名称。

从其他问题我发现WebSphere和Spark都在内部使用SLF4J。我如何防止Spark中的SLF4J通过自身重定向来自其他应用程序的所有日志记录?

我正在使用WebSphere Application Server v8.5.5.6和Apache Spark v1.4.1 CHD4二进制分发。

+0

嗨,你使用的是Liberty还是经典的WebSphere? – Alasdair

+0

这将是“经典”的WebSphere,绝对不是Liberty。 – Wormbo

回答

1

下面的方法似乎已经解决了我的问题记录:

  1. 删除org文件夹下的文件夹slf4j在Spark jar文件中。 (任何用于修改ZIP文件的标准工具都可以在这里使用。)
  2. 除了修改过的Spark jar之外,还将用于SLF4J的API和JDK14 jar作为库添加到Web应用程序中。

(说实话,我并没有把太多的额外努力来试图再配置星火的日志记录和我的做法可能有点生硬,但很有效。)

上述步骤成功地防止火花从接管WebSphere日志记录。相反,所有Spark生成的日志都是由WebSphere按原样处理的。

当然这并不能解决其他缺陷,比如Spark只允许每个JVM使用一个SparkContext(并且WebSphere节点上的所有应用程序都在单个JVM中运行),所以这种设置将继续用于测试仅用于目的。

0

我的猜测是带有spark的slf4j正在配置根记录器(例如SLF4J桥处理程序),它将所有JUL记录器输出路由到SLF4J,然后记录到System.err。

自由需要和使用JUL(除了我们自己的)。任何与根JUL日志处理程序混淆的东西都会混淆Liberty的日志记录(感谢JVM单身人士)。它看起来像Apache Spark假定/强制使用log4j,并假定它应该将所有JUL都路由到log4j。

您需要配置log4j来处理Liberty消息,或者使用Apache Spark(可能会进行一些修改)来允许使用JUL(然后Liberty通过server.xml配置进行管理)。

或许修改SLF4J(logback.xml)配置,每这篇文章: How to customize logging levels for Cassandra and Spark

+0

谢谢,明天我会看看。我曾希望能够在不付出太多努力的情况下让它工作,所以希望我能说服它做我想做的事情,而不必自己编译它。 – Wormbo