ドキュメント
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エラー表示されているが、英語のページに行くとバージョンが確認できる。
現在の最新版は以下の模様。
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) ・・・ このフォーマットは決まっている。「ログ種類」のところは既存のものにまとめることも出来るし、自分オリジナルなものを定義することも出来る
ソースコード全掲
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()
}
ログビューア
なおこのプログラムの実行にあたって「ログ種類」に「mylogtype」というオリジナルなものを指定してみた。
終わりに
これをベースにあとはAPIドキュメントのsetter系中心に読んでいけばログをリッチにしていけるはず!