여러 프로세스에서 로그를 생성 할 때 Google 클라우드 로깅을 수집하고 보내는 기본 방법은 무엇입니까?여러 프로세스에서 CloudLoggingHandler로 로깅
내 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.
나는 프로토 타입을 작성했기 때문에 대부분 내 제안에 집착했는데, "즉시 사용할 수있는"상태였으며 성능 문제가 있는지 확인하지 않았습니다. 나는이 선택을 재고하고있다.
사실 내가 이해 한대로 BackgroundThreadTransport이있는 CloudLoggingHandler은 로깅 엔드 포인트로 로그가 전송 될 때까지 기본 스레드를 차단합니다. 이것은 각 로그 라인마다 거의 발생합니다. 실제로 일괄 처리는 하나의 로그 레코드 (cf source)가있는 즉시 전송됩니다.
내 dev 환경에서 여러 프로세스가 동시에 로그 할 때 하나의 프로세스가 로그를 보내기 위해 최대 1 초 동안 대기하는 것으로 나타납니다. 나는 그것이 대부분 네트워크 비용이라고 생각하며 Google 데이터 센터 내에서 "그리 많지는 않습니다"로 축소 될 것입니다.
모든 로그 레코드를 Queue으로 푸시하는 StreamHandler을 정의하려고합니다. 이 큐는 로깅 엔드 포인트에 로그를 전송하는 담당 할 것 Process 읽을 수있다. 이 프로세스는 관련성이있는 경우 CloudLoggingHandler를 사용하여이를 수행 할 수 있습니다.
의미가 있습니까?
니스! 흥미로운 점은 단지 10 개 이상의 항목에 대해 차이가 있다는 것입니다. 나는 결과가 그들 자신을 위해 정말로 말하는 것이라고 생각한다. –
CloudLoggingHandler에서 파생 된 사용자 지정 처리기 BatchCloudLoggingHandler로 끝났습니다. CloudLoggingHandler와 달리 BatchCloudLoggingHandler는 스레드로부터 안전하지 않으며 BackgroundThreadTransport에 의존하지 않습니다. 스레드 안전성을 보장하기 위해 QueueHandler 및 QueueListener를 사용합니다. BatchCloudLoggingHandler는 로그 레코드의 실제 일괄 처리 (즉, 둘 이상의 로그 레코드가있는 일괄 처리)를 수행합니다. 그러나, 나는이 approche의 효율성을 어떻게 측정해야하는지 모른다. –