Help us understand the problem. What is going on with this article?

Java用SDKを使ってStackDriver Logging v2(Cloud Logging)のログ書き込み

More than 3 years have passed since last update.

ドキュメント

StackDriver Logging公式ドキュメント
https://cloud.google.com/logging/docs/

クライアントライブラリについて
https://cloud.google.com/logging/docs/api/libraries

はじめに

2016.11現在、v2への移行期。
ブラウザで閲覧した際のログビューアにも「今後数週間で、ログ閲覧者は Stackdriver Logging v2 API に移行します。」と表示されることもあり最新のv2で試してみることにする。
なお、自分がScalaの方が書きやすいのでScalaで書いてマス(といっても大半Java APIを呼んでいるだけなので問題なく読めるはずです)。

ライブラリの入手

上記「クライアントライブラリについて」のページにある「ライブラリをプロジェクトに追加する」のところに表示されているMAVEN/GRADLEはなぜか404エラー表示されているが、英語のページに行くとバージョンが確認できる。
現在の最新版は以下の模様。

build.sbt
scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "com.google.apis" % "google-api-services-logging" % "v2beta1-rev23-1.22.0"
)

プログラミング

参考にしたドキュメントはこちら:
https://cloud.google.com/logging/docs/api/tasks/creating-logs
Githubにあがっているコードはこちら:
https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/logging/src/main/java/ListLogs.java

このコードには注意点があり、 v1ベースで書かれているということで、これをv2のAPI用に翻訳しないといけない。

その際に参考になるのがこちらの移行ガイド。
https://cloud.google.com/logging/docs/api/v2/migration-to-v2

というわけでコードを書いていく。

まずはLoggingを取得するところ。こちらは変更なしで大丈夫。

  def getLoggingService() = {
    val transport = new NetHttpTransport()
    val jsonFactory = JacksonFactory.getDefaultInstance()
    var credential = GoogleCredential.getApplicationDefault(transport, jsonFactory)
    if (credential.createScopedRequired()) {
      credential = credential.createScoped(List(LoggingScopes.LOGGING_READ).asJava)
    }

    new Logging.Builder(transport, jsonFactory, credential).setApplicationName("mysample").build()
  }

次にログを書き込む部分。
v2 APIに移行しつつ、必須部分だけに削ってみたのが以下。

  val monitor = new MonitoredResource().setType("global")  // (1)

  val entry =
    new LogEntry()
        .setTextPayload("hello, logging!") // (2)
        .setLogName("projects/自分のプロジェクトID/logs/ログ種類") // (3)
        .setResource(monitor)

  val content = new WriteLogEntriesRequest().setEntries(List(entry).asJava)
  service.entries().write(content).execute()

(1) ・・・ 「global」とするとログビューア上では「Custom」に、「gae_app」とするとApp Engineにカテゴライズされる。ちなみにどこかに一覧ないのかな?と思ったが見つけられず...
(2) ・・・ 出力したいメッセージを書く
(3) ・・・ このフォーマットは決まっている。「ログ種類」のところは既存のものにまとめることも出来るし、自分オリジナルなものを定義することも出来る

ソースコード全掲

Main.scala
import com.google.api.client.http.javanet._
import com.google.api.client.json.jackson2._
import com.google.api.client.googleapis.auth.oauth2._
import com.google.api.services.logging._

import com.google.api.services.logging.v2beta1._
import com.google.api.services.logging.v2beta1.model._

import scala.collection.JavaConverters._

object Main extends App {
  val service = {
    val transport = new NetHttpTransport()
    val jsonFactory = JacksonFactory.getDefaultInstance()
    var credential = GoogleCredential.getApplicationDefault(transport, jsonFactory)
    if (credential.createScopedRequired()) {
      credential = credential.createScoped(LoggingScopes.all())
    }

    new Logging.Builder(transport, jsonFactory, credential).setApplicationName("mysample").build()
  }

  val monitor = new MonitoredResource().setType("global")

  val entry =
    new LogEntry()
        .setTextPayload("hello, logging!")
        .setLogName("projects/自分のプロジェクトID/logs/ログ種類")
        .setResource(monitor)

  val content = new WriteLogEntriesRequest().setEntries(List(entry).asJava)
  service.entries().write(content).execute()
}

ログビューア

logging.png

なおこのプログラムの実行にあたって「ログ種類」に「mylogtype」というオリジナルなものを指定してみた。

終わりに

これをベースにあとはAPIドキュメントのsetter系中心に読んでいけばログをリッチにしていけるはず!

mtoyoshi
調査モノのアウトプットが中心です
fringe81
Fringeは、最新のテクノロジーとプロフェッショナルによるサービスにより、社会課題に仮説を立てて市場に広げていくことで、数十年という長期的なスパンで価値を生み出し続け、より良い世界を創る集団です。 既存の領域に限らず、時流を読み、仮説を生み出し、テクノロジーの力で優れたサービスを生み出し続けます。
https://www.fringe81.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away