使用 py4j 在 java/python 项目中将 Log4j 连接到 ipython notebook stderr

Posted

技术标签:

【中文标题】使用 py4j 在 java/python 项目中将 Log4j 连接到 ipython notebook stderr【英文标题】:Connecting Log4j to ipython notebook stderr in a java/python project using py4j 【发布时间】:2017-01-27 00:09:09 【问题描述】:

我有一个项目,它使用 java、scala 和 Apache Spark 对基因组数据进行分布式计算。使用 py4j 并模仿 PySpark 模型,我们公开了一个调用 JVM 的 python API。我们的目标是将这个模型引入到 jupyter notebooks 中,到目前为止这很容易,但有一个挥之不去的问题:日志记录。

问题

我们(和 Spark)使用 log4j 将日志消息写入日志文件和 stderr。这个stderr是java进程的stderr,所以如果我从jupyter notebook运行两个命令:

print('foo')
info('bar')  # calls log4j logger.info in JVM

我看到 'foo' 被写入 jupyter 单元格,但 'bar' 被写入运行 jupyter 进程的终端。

我的目标

将 log4j 连接到 jupyter notebook,以便将 log4j 消息写入 jupyter 单元,而不是终端。

我尝试过的

java log4j.ConsoleAppender 正在写入 java stderr。所以,我们需要以某种方式通过 jupyter 路由 java stderr,对吗?这可能涉及使用System.setOut(...) 和一个连接到jupyter 进程的PrintStream 对象,但我还不确定该怎么做。

【问题讨论】:

【参考方案1】:

我们通过使用单独的套接字在 Java 和 Python 之间进行通信来解决这个问题。这是提交差异:https://github.com/hail-is/hail/commit/93d7e95a82ab39501eede7ecb301538bcd013ea8

【讨论】:

以上是关于使用 py4j 在 java/python 项目中将 Log4j 连接到 ipython notebook stderr的主要内容,如果未能解决你的问题,请参考以下文章

Java InputStream 到 Python (PY4J)

来自 Java Runnable 的 Py4J 回调

Pyspark 错误:py4j.java_gateway:尝试连接到 Java 服务器时发生错误(127.0.0.1:50532)

py4J 最简单的例子

使用 py4j 将矩阵作为 int[][] 数组从 Python 发送到 Java

py4j - 我将如何在 java 中调用 python 方法