10

我在主函数/进程中使用了日志模块,它运行良好,但在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")

4

2 回答 2

11

有几件事需要注意。

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

这是一个工作示例:

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")
于 2019-03-21T17:51:18.893 回答
0

我在 Ray 抑制来自记录器的控制台输出时遇到了麻烦。为了解决这个问题,添加一个StreamHandler

your_logger.addHandler(logging.StreamHandler())
于 2020-07-31T17:58:54.647 回答