如何在 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 日志记录?的主要内容,如果未能解决你的问题,请参考以下文章