当日志由多个进程生成时,哪种是收集日志并将其发送到谷歌云日志的首选方式?
这是我基于 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()
我在这里阅读了基于队列的日志处理程序,但 CloudLoggingHandler 在隔离线程中使用批量提交,因此基于队列的处理程序将是矫枉过正。我对么 ?
Sources表明 CloudLoggingHandler 是线程安全的,因此让所有进程共享一个 CloudLoggingHandler 实例可能就足够了。它会起作用吗?如果是这样是不是太苛刻了?
下面进行编辑以回答@thomas-schultz。
我坚持我的提议,主要是因为我在做原型设计,它“开箱即用”,而且我没有检查性能问题。我正在重新考虑这个选择。
实际上,据我了解,带有BackgroundThreadTransport的CloudLoggingHandler 会阻塞主线程,直到将日志发送到日志记录端点。几乎每个日志行都会发生这种情况。实际上,一旦有一个日志记录(cf source)就会发送批次。
在我的开发环境中,当多个进程同时记录时,一个进程会等待长达 1 秒的时间来发送日志。我想这主要是网络成本,它会从谷歌数据中心缩小到“不那么多”。
我正在考虑定义一个StreamHandler,它将所有日志记录推送到Queue。该队列将由负责将日志发送到日志记录端点的进程读取。如果相关,此过程可能依赖 CloudLoggingHandler 来执行此操作。
这有意义吗?