LoginSignup
3
5

More than 5 years have passed since last update.

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

Posted at

ドキュメント

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系中心に読んでいけばログをリッチにしていけるはず!

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5