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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用py4j将Log4j连接到java / python项目中的ipython notebook stderr相关的知识,希望对你有一定的参考价值。

我有一个项目,使用java,scala和Apache Spark来对基因组数据进行分布式计算。使用py4j并模仿PySpark模型,我们公开了一个调用JVM的python API。我们的目标是将这个模型带入jupyter笔记本电脑,到目前为止,它已经非常容易了,还有一个挥之不去的问题:日志记录。

The problem

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

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

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

My goal

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

What I've tried

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

答案

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

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

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

py4j.protocol.Py4JNetworkError : 尝试连接到 Java 服务器时出错

在 log4j 中重新连接到数据库

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

使用 Py4j 将 Python 对象发送到 Java

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