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

# ドキュメント
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エラー表示されているが、英語のページに行くとバージョンが確認できる。
現在の最新版は以下の模様。

```scala: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を取得するところ。こちらは変更なしで大丈夫。

```scala
  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に移行しつつ、必須部分だけに削ってみたのが以下。

```scala
  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) ・・・ このフォーマットは決まっている。「ログ種類」のところは既存のものにまとめることも出来るし、自分オリジナルなものを定義することも出来る

## ソースコード全掲

```scala: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()
}
```

## ログビューア
<img width="754" alt="logging.png" src="https://qiita-image-store.s3.amazonaws.com/0/159/4df63b99-5043-0530-3f45-eddd75431de6.png">

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

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