Apache Spark日志记录重定向WebSphere日志输出

时间:2015-08-31 12:35:08

标签: logging apache-spark websphere slf4j

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

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

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

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

2 个答案:

答案 0 :(得分:1)

以下方法似乎解决了我的日志记录问题:

  1. 删除Spark jar文件中slf4j文件夹下的org文件夹。 (任何用于修改ZIP文件的标准工具都可以在此处使用。)
  2. 除了修改后的Spark jar之外,还将SLF4J的API和JDK14 jar作为库添加到Web应用程序中。
  3. (说实话,我没有花费太多额外的努力来尝试配置Spark的日志记录,我的方法可能有点生硬,但它确实有效。)

    上述步骤成功阻止了Spark接管WebSphere日志记录。相反,所有Spark生成的日志都由WebSphere处理。

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

答案 1 :(得分:0)

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

Liberty需要并使用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