如何在 Ray 中使用 python 日志记录?

Posted

技术标签:

【中文标题】如何在 Ray 中使用 python 日志记录?【英文标题】:How can I use the python logging in Ray? 【发布时间】:2019-08-11 19:32:24 【问题描述】:

我在主函数/进程中使用了日志模块,它运行良好,但在Actor进程/子进程中似乎无法运行。如何让它发挥作用?在下面的代码示例中,logging.info 在主进程中工作,但在工作进程中失败。谢谢。

import logging
import ray

@ray.remote
class Worker(object):
   ...

   def train(self):
       logging.info("fail print")


...

worker = Worker.remote()

ray.get(worker.train.remote())

logging.info("successful print")

【问题讨论】:

嗨韩,你的问题解决了吗? 【参考方案1】:

有几件事需要注意。

首先,您应该在worker 内部创建一个新的记录器,因为worker 在不同的Python 进程上运行。如果您尝试在工作人员内部使用在工作人员之外创建的记录器,那么 Ray 将尝试腌制记录器并将其发送到工作进程,而 Python 记录器在腌制和解除腌制时通常不会正常运行。 其次,您必须确保日志记录级别设置正确。我使用 logger.warning 而不是 logger.info,因为 Python 日志记录级别默认设置为 `warning。

这是一个工作示例:

import logging
import ray

logger = logging.getLogger(__name__)

@ray.remote
class Worker(object):
    def __init__(self):
        self.logger = logging.getLogger(__name__)
    def train(self):
        self.logger.warning("print from inside worker")


ray.init()

worker = Worker.remote()

ray.get(worker.train.remote())

logger.warning("print from outside worker")

【讨论】:

谢谢。如果我想将日志信息写入同一个调试文件,哪种方式好?创建两个记录器并设置相同的基本配置? logging.basicConfig(...,filename="the same filepath")我可以创建共享配置吗? 我没有尝试过,所以我不确定,但我认为让两个工作人员登录到同一个文件是不可取的,因为他们可能会覆盖彼此的日志,或者可能会散布他们的日志制作该文件难以阅读。 记录器是线程安全的。只需确保使文件处理程序使用附加模式:your_logger.addHandler(logging.FileHandler(outpath, mode="a+")) 我在光线远程函数中创建记录器,并要求它写入相同的日志文件,但它记录的主要信息不是来自远程函数。任何指针都会有所帮助。 logger = logging.getLogger(log_name) logger.addHandler(logging.FileHandler(lfn, mode="a+"))【参考方案2】:

我遇到了 Ray 抑制来自记录器的控制台输出的问题。要解决这个问题,请添加StreamHandler

your_logger.addHandler(logging.StreamHandler())

【讨论】:

以上是关于如何在 Ray 中使用 python 日志记录?的主要内容,如果未能解决你的问题,请参考以下文章

在 python 项目中如何记录日志

如何使用 python Ray 在一个大列表上并行化?

如何在 Python 中打印特定月份范围内的事务日志

如何在 Python Django 中运行单元测试时禁用日志记录?

如何使用日志记录 Python 模块写入文件?

如何使用 Python 在日志文件中复制/捕获标准输出