1

私はStackdriverログを処理するためにデータフローパイプラインを構築しています。データはPub/Subから読み込まれ、結果はBigQueryに書き込まれます。 Pub/Subから読み込むと、LogEntryオブジェクトのJSON文字列が取得されますが、実際に興味があるのは、ユーザログメッセージを含むprotoPayload.lineレコードです。私はLogEntry JSONオブジェクトを解析する必要がそれらを取得し、私はGoogle example 2歳がそれを行う方法を見つけるために:Parse Stackdriver LogEntry JSON with Dataflow pipeline

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、私のために動作しません。私はそれがcom.google.api.services.logging Google Cloudドキュメントのどこにも言及されていないとして動作すると思われるかどうかはわかりません。現在のログライブラリは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オブジェクトを解析する理想的な方法ではないと思います。