【发布时间】:2016-10-24 14:59:31
【问题描述】:
当日志由多个进程生成时,哪种是收集日志并将其发送到谷歌云日志的首选方式?
这是我基于 CloudLoggingHandler 的提案,您愿意批评它吗?
import google
from multiprocessing import Process
from logging import getLogger
class Worker(Process):
def __init__(self):
super(Worker, self).__init__()
def __setup_logger(self):
handler = CloudLoggingHandler(google.cloud.logging.Client(), name='log-name')
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
google.cloud.logging.handlers.setup_logging(handler)
def run(self):
self.__setup_logger()
for i in range(10):
logging.warning("i=%d", i)
if __name__ == "__main__":
for _ in range(2):
w = Worker()
w.start()
我阅读了有关基于队列的日志处理程序here,但 CloudLoggingHandler 在隔离线程中使用批量提交,因此基于队列的处理程序将是矫枉过正。我说的对吗?
Sources 表示 CloudLoggingHandler 是线程安全的,因此所有进程共享一个 CloudLoggingHandler 实例可能就足够了。它会起作用吗?如果是这样是不是太苛刻了?
编辑下方回答@thomas-schultz。
我坚持我的提议,主要是因为我在制作原型,它“开箱即用”,而且我没有检查性能问题。我正在重新考虑这个选择。
确实,据我了解,CloudLoggingHandler 和 BackgroundThreadTransport 会阻塞主线程,直到日志发送到日志记录端点。几乎每个日志行都会发生这种情况。实际上,只要有一条日志记录 (cf source),就会发送批次。
在我的开发环境中,当多个进程同时登录时,一个进程会等待长达 1 秒的时间来发送日志。我想这主要是网络成本,它会从谷歌数据中心缩小到“不那么多”。
我正在考虑定义一个StreamHandler,它将所有日志记录推送到Queue。这个队列将被Process 读取,该Process 负责将日志发送到日志端点。如果相关,此过程可能依赖 CloudLoggingHandler 来执行此操作。
这有意义吗?
【问题讨论】:
标签: logging google-cloud-python