Java 用 Stackdriver Logging の設定

Java アプリケーションから Stackdriver Logging にログを書き込むには、Logback アペンダーまたは java.util.logging ハンドラを使用するか、Java 用 Stackdriver Logging ライブラリを直接使用します。

Java 用 Stackdriver Logging ライブラリを使用するために、Stackdriver Logging エージェントをインストールする必要はありません。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Platform プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. Stackdriver Logging API を有効にします。

    APIを有効にする

Logback アペンダーによる Stackdriver Logging のロギング

Logback アペンダーを使用すると、Stackdriver Logging を SLF4J ロギング ファサードで使用できます。

依存関係のインストール

Maven を使用している場合は、次のものを pom.xml ファイルに追加します。
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-logging-logback</artifactId>
  <version>0.105.0-alpha</version>
</dependency>
Gradle を使用している場合は、次のものを依存関係に追加します。
compile 'com.google.cloud:google-cloud-logging-logback:0.105.0-alpha'
SBT を使用している場合は、次のものを依存関係に追加します。
libraryDependencies += "com.google.cloud" % "google-cloud-logging-logback" % "0.105.0-alpha"

Logback の構成

Logback は、プログラムで構成することも、XML または Groovy 形式のスクリプトを使用して構成することもできます。

重大度の最小しきい値やログ名をカスタマイズすることも、機能強化を行うこともできます。これは、XML 形式の Logback 構成のサンプルです。

<configuration>
  <appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">
    <!-- Optional : filter logs at or above a level -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
    <log>application.log</log> <!-- Optional : default java.log -->
    <resourceType>gae_app</resourceType> <!-- Optional : default: auto-detected, fallback: global -->
    <enhancer>com.example.logging.logback.enhancers.ExampleEnhancer</enhancer> <!-- Optional -->
    <flushLevel>WARN</flushLevel> <!-- Optional : default ERROR -->
  </appender>

  <root level="info">
    <appender-ref ref="CLOUD" />
  </root>
</configuration>

Stackdriver Logging に Logback アペンダーを使用するように Logback を構成すると、SLF4J のロギング API を使用してログをリダイレクトできるようになります。次のスニペットでは、アプリケーション内で SLF4J ファサードを使用してロギングを行う方法を示しています。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Quickstart {
  private static final Logger logger = LoggerFactory.getLogger(Quickstart.class);

  public static void main(String[] args) {
    logger.info("Logging INFO with Logback");
    logger.error("Logging ERROR with Logback");
  }
}

java.util.logging ハンドラ

デフォルトの Java Logging API ハンドラから Stackdriver Logging API を使用することもできます。

依存関係のインストール

Maven を使用している場合は、次のものを pom.xml ファイルに追加します。
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-logging</artifactId>
  <version>1.87.0</version>
</dependency>
Gradle を使用している場合は、次のものを依存関係に追加します。
compile 'com.google.cloud:google-cloud-logging:1.87.0'
SBT を使用している場合は、次のものを依存関係に追加します。
libraryDependencies += "com.google.cloud" % "google-cloud-logging" % "1.87.0"

IntelliJ または Eclipse を使用している場合は、次の IDE プラグインを使用してプロジェクトにクライアント ライブラリを追加できます。

プラグインでは、サービス アカウントのキー管理などの追加機能も提供されます。詳細は各プラグインのドキュメントをご覧ください。

java.util.logging の構成

logging ハンドラは、プログラムで追加することも、構成ファイルを使用して追加することもできます。構成ファイルのパスは、システム プロパティとしてアプリケーションに渡す必要があります。 -Djava.util.logging.config.file=/path/to/logging.properties

次に構成ファイルの例を示します。

# To use this configuration, add to system properties : -Djava.util.logging.config.file="/path/to/file"
#
.level = INFO

# it is recommended that io.grpc and sun.net logging level is kept at INFO level,
# as both these packages are used by Stackdriver internals and can result in verbose / initialization problems.
io.grpc.netty.level=INFO
sun.net.level=INFO

com.example.logging.jul.Quickstart.handlers=com.google.cloud.logging.LoggingHandler
# default : java.log
com.google.cloud.logging.LoggingHandler.log=custom_log

# default : INFO
com.google.cloud.logging.LoggingHandler.level=FINE

# default : ERROR
com.google.cloud.logging.LoggingHandler.flushLevel=ERROR

# default : auto-detected, fallback "global"
com.google.cloud.logging.LoggingHandler.resourceType=container

# custom formatter
com.google.cloud.logging.LoggingHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%3$s: %5$s%6$s

#optional enhancers (to add additional fields, labels)
com.google.cloud.logging.LoggingHandler.enhancers=com.example.logging.jul.enhancers.ExampleEnhancer

次のスニペットでは、java.util.logging を使用してログを記録する方法を示しています。

import java.util.logging.Logger;

public class Quickstart {
  private static final Logger logger = Logger.getLogger(Quickstart.class.getName());

  public static void main(String[] args) {
    logger.info("Logging INFO with java.util.logging");
    logger.severe("Logging ERROR with java.util.logging");
  }
}

共通構成

以降のセクションでは、Stackdriver Logging に使用する java.util.logging ハンドラと Logback アペンダーに共通する構成について説明します。

デフォルト

Logback アペンダーと java.util.logging ハンドラは、次のデフォルトを使用して Stackdriver Logging クライアントをインスタンス化します。

  • ログの名前: java.log

  • ロギングの最小しきい値: INFO

  • フラッシュ重大度: ERROR

Java 用 Stackdriver Logging ライブラリは、サイズや最終書き込みからの経過時間に基づいてメッセージをバッチ処理します。フラッシュ重大度以上のロギング リクエストを含むバッチは、すぐに書き出されます。

モニタリング対象リソースの検出

Stackdriver Logging ライブラリから送信されるすべてのログでは、アプリケーションを特定するためにモニタリング対象リソースのタイプを必要とします。

Logback アペンダーと java.util.logging ハンドラは、App Engine、Compute Engine、Google Kubernetes Engine アプリケーションのリソースタイプを自動的に検出します。

他の環境では、global モニタリング対象リソースがデフォルトで使用されます。

モニタリング対象リソースのタイプは、Logback アペンダーの構成または java.util.logging ハンドラの構成で、有効なタイプにオーバーライドできます。

追加のフィールドとラベル

Logback アペンダーと java.util.logging ハンドラでは、LoggingEnhancer のインスタンスを使用して LogEntry オブジェクトにフィールドを追加したり、既存のフィールドを更新したりできます。

エンハンサーは、Logback アペンダーの構成または java.util.logging ハンドラの構成に示すように構成する必要があります。

import com.google.cloud.logging.LogEntry;
import com.google.cloud.logging.LoggingEnhancer;

// Add / update additional fields to the log entry
public class ExampleEnhancer implements LoggingEnhancer {

  @Override
  public void enhanceLogEntry(LogEntry.Builder logEntry) {
    // add additional labels
    logEntry.addLabel("test-label-1", "test-value-1");
  }
}

インストールの詳細については、Java 用 Stackdriver Logging ライブラリのドキュメントをご覧ください。公開バグトラッカーを使用して問題を報告することもできます。

Cloud クライアント ライブラリを直接使用する

Java 用 Stackdriver Logging Cloud クライアント ライブラリを直接使用する方法については、Stackdriver Logging クライアント ライブラリをご覧ください。

Google Cloud Platform での実行

Java 用 Stackdriver Logging ライブラリを使用するには、GCP で Cloud IAM ログ書き込み役割が必要です。ほとんどの GCP 環境で、この役割はデフォルトで付与されています。

App Engine

App Engine では、デフォルトでログ書き込み役割が付与されます。

Java 用 Stackdriver Logging ライブラリは、明示的に認証情報を提示しなくても使用できます。

App Engine のアプリケーションでは、Stackdriver Logging が自動的に有効になります。特別な設定は必要ありません。

App Engine スタンダード環境では、デフォルトjava.util.logging.Logger API を使用するので、Stackdriver Logging に直接書き込まれ、簡単に構成できます。

詳しくは、App Engine のドキュメントでアプリケーション ログの読み込みと書き込みに関する説明をご覧ください。

App Engine フレキシブル環境

App Engine フレキシブル環境の場合、java.util.logging はデフォルトで ConsoleHandler を使用してログを stdoutstderr に送信します。

Jetty ランタイムは、Java 用 Stackdriver Logging ライブラリにバンドルされています。

java.util.logging ハンドラを使用すると、次のように app.yamllogging.properties を指定することで、Stackdriver Logging に直接ログを書き込めます。

    env_variables:
      JETTY_ARGS: -Djava.util.logging.config.file=WEB-INF/logging.properties

java.util.logging ハンドラまたは Logback アペンダーを使用すると、Jetty ランタイムでトレース ID をロギングできます。

App Engine フレキシブル環境で実行すると、TraceLoggingEnhancer インスタンスがラベル trace_id を使用してスレッドセーフのトレース ID を各ログエントリに追加します。

Google Kubernetes Engine

Google Kubernetes Engine では、クラスタの作成時に logging.write アクセス スコープを追加する必要があります。

gcloud container clusters create example-cluster-name --scopes https://www.googleapis.com/auth/logging.write

Compute Engine

Compute Engine VM インスタンスを使用する場合は、各インスタンスに cloud-platform アクセス スコープを追加します。Google Cloud Platform Console で新しいインスタンスを作成する場合は、[インスタンスの作成] パネルの [ID と API へのアクセス] セクションで行うことができます。Compute Engine のデフォルト サービス アカウントまたは別のサービス アカウントを使用し、[ID と API へのアクセス] セクションの [すべての Cloud API に完全アクセス権を許可] を選択します。どのサービス アカウントを選択する場合でも、GCP Console の [IAM と管理] でログ書き込み役割が付与されていることを確認してください。

ローカルやその他の場所での実行

GCP の外部で Java 用 Stackdriver Logging ライブラリを使用するには、GCP プロジェクト ID と該当するサービス アカウント認証情報を Java 用 Stackdriver Logging ライブラリに直接指定する必要があります。これは、個人用のワークステーション、データセンターのコンピュータ、他のクラウド プロバイダの VM インスタンスにおけるエージェントの実行に適用されます。詳細については、サービス アカウントの認証情報を手動で取得して指定するをご覧ください。

ログの表示

デプロイ後、GCP Console のログビューアでログを表示できます。

ログビューアに移動

ログビューアでは 1 つ以上のリソースを指定する必要がありますが、どのリソースを選択すべきかを判断するのが難しい場合もあります。その場合は、次のヒントを参考にしてください。

  • アプリケーションを App Engine にデプロイしている場合や、App Engine 固有のライブラリを使用している場合は、リソースを GAE アプリケーションに設定します。

  • アプリケーションを Compute Engine にデプロイしている場合は、リソースを GCE VM インスタンスに設定します。

  • アプリケーションを Google Kubernetes Engine にデプロイしている場合は、クラスタのロギング構成に応じてログエントリのリソースタイプが異なります。従来の Stackdriver と Stackdriver Kubernetes Monitoring ソリューションの詳細とこれらのオプションがリソースタイプに与える影響については、Stackdriver Kubernetes Monitoring への移行をご覧ください。

  • アプリケーションが Stackdriver Logging API を直接使用している場合、リソースは API と構成に依存します。たとえば、アプリケーションでリソースを指定することも、デフォルトのリソースを使用することもできます。

  • ログビューアにログが表示されていないときに、すべてのログエントリを表示するには、高度なフィルタモードに切り替えて空のフィルタを使用します。

    1. 高度なフィルタモードに切り替えるには、ログビューアの上部にあるメニュー(▾)をクリックして、[高度なフィルタに変換] を選択します。
    2. フィルタ ボックスに表示されているコンテンツをクリアします。
    3. [フィルタを送信] をクリックします。

    個々のエントリを調べてリソースを特定します。

詳細については、ログの表示高度なログフィルタをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。