1

Stackdriver 로그를 처리하기 위해 데이터 흐름 파이프 라인을 만들고 데이터를 Pub/Sub에서 읽고 결과를 BigQuery에 기록합니다. Pub/Sub에서 읽을 때 LogEntry 개체의 JSON 문자열을 얻었지만 실제로 관심이있는 내용은 사용자 로그 메시지가 포함 된 protoPayload.line 레코드입니다. 내가 LogEntry JSON 개체를 구문 분석 할 필요가 사람들을 얻을 내가 Google example 두 살 그것을 수행하는 방법을 발견하려면Parse Stackdriver 데이터 흐름 파이프 라인의 LogEntry JSON

import com.google.api.client.json.JsonParser; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.logging.model.LogEntry; 

try { 
    JsonParser parser = new JacksonFactory().createJsonParser(entry); 
    LogEntry logEntry = parser.parse(LogEntry.class); 
    logString = logEntry.getTextPayload(); 
} 
catch (IOException e) { 
    LOG.error("IOException parsing entry: " + e.getMessage()); 
} 
catch(NullPointerException e) { 
    LOG.error("NullPointerException parsing entry: " + e.getMessage()); 
} 

을 불행하게도 이것은 logEntry.getTextPayload() 반환 null, 나를 위해 작동하지 않습니다. 심지어는 Google Cloud 문서에서 com.google.api.services.logging 라이브러리가 언급되지 않았기 때문에 현재 로깅 라이브러리가 google-cloud-logging 인 것으로 보입니다.

그렇다면 누구든지 LogEntry 개체를 구문 분석하는 가장 적절하거나 간단한 방법을 제안 할 수 있습니까?

답변

1

특히 나무 트래버 싱 접근 방식을 사용하여 gson 라이브러리로 LogEntry JSON을 수동으로 구문 분석하는 일이 발생했습니다.

static class ProcessLogMessages extends DoFn<String, String> { 
    @ProcessElement 
    public void processElement(ProcessContext c) { 
     String entry = c.element(); 

     JsonParser parser = new JsonParser(); 
     JsonElement element = parser.parse(entry); 
     if (element.isJsonNull()) { 
      return; 
     } 
     JsonObject root = element.getAsJsonObject(); 
     JsonArray lines = root.get("protoPayload").getAsJsonObject().get("line").getAsJsonArray(); 
     for (int i = 0; i < lines.size(); i++) { 
      JsonObject line = lines.get(i).getAsJsonObject(); 
      String logMessage = line.get("logMessage").getAsString(); 

      // Do what you need with the logMessage here 
      c.output(logMessage); 
     } 
    } 
} 

이 충분히 간단하고 나는 단지 protoPayload.line.logMessage 객체에 관심이 있기 때문에 나를 위해 잘 작동 : 여기 작은 조각이다. 하지만 많은 특성을 가지고 작업해야하는 경우 이것은 이상적인 방법으로 LogEntry 개체를 파싱하는 것이 아닙니다.

관련 문제