Quarkus を使用したロギングの設定

Red Hat build of Quarkus 1.11

概要

アプリケーション内で発生したイベントに関する情報を収集するようにロギングを設定します。

はじめに

アプリケーション開発者は、ロギングを使用して、アプリケーションの実行中に発生するイベントに関するメッセージを表示および記録できます。ログメッセージは、開発およびテスト中にアプリケーションをデバッグしたり、実稼働環境でアプリケーションを監視したりするために使用できる情報を提供します。

前提条件

  • OpenJDK (JDK) 11 がインストールされ、JAVA_HOME 環境変数が Java SDK の場所を指定するように設定されている。

    • Red Hat ビルドの Open JDK は、Red Hat カスタマーポータルの Software Downloads ページからダウンロードできます (ログインが必要です)。
  • Apache Maven 3.6.2 以降がインストールされている。

  • Quarkus Maven プロジェクトがある。

Red Hat ドキュメントへのフィードバック (英語のみ)

弊社の技術的な内容についてのフィードバックに感謝します。ご意見をお聞かせください。コメントの追加、Insights の提供、誤字の修正、および質問を行う必要がある場合は、ドキュメントで直接行うこともできます。

注記

Red Hat アカウントがあり、カスタマーポータルにログインしている必要があります。

カスタマーポータルからドキュメントのフィードバックを送信するには、以下の手順を実施します。

  1. Multi-page HTML 形式を選択します。
  2. ドキュメントの右上にある Feedback ボタンをクリックします。
  3. フィードバックを提供するテキストのセクションを強調表示します。
  4. ハイライトされたテキストの横にある Add Feedback ダイアログをクリックします。
  5. ページの右側のテキストボックスにフィードバックを入力し、Submit をクリックします。

フィードバックを送信すると、自動的に問題の追跡が作成されます。Submit をクリックすると表示されるリンクを開き、問題の監視を開始するか、さらにコメントを追加します。

貴重なフィードバックにご協力いただきありがとうございます。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ をご覧ください。

第1章 JBoss LogManager およびサポートされているロギングフレームワーク

Quarkus は JBoss LogManager ロギングバックエンドを使用して、ログデータを収集および管理します。JBoss Logging を使用して、Quarkus 内部イベントおよびアプリケーション内のイベントに関するデータを収集できます。application.properties ファイルにロギングの動作を設定できます。

JBoss LogManager は、JBoss Logging に加えて、いくつかのサードパーティーのロギング API をサポートします。JBoss LogManager は、サポートされるすべてのロギング API からのログをマージします。

ロギング用にサポートされている API:

Quarkus は、JBoss Logging を使用してすべてのロギング機能を処理します。別のロギング API に依存するライブラリーを使用する場合は、このライブラリーを依存関係から除外し、JBoss Logging を設定してサードパーティー API のロギングアダプターを使用する必要があります。

1.1. Apache Log4j ロギングフレームワークの追加

Apache Log4j は、ロギングバックエンドとロギング API を含むロギングフレームワークです。Quarkus は JBoss LogManager バックエンドを使用するため、log4j2-jboss-logmanager ライブラリーをプロジェクトに追加し、ロギング API として Log4j を使用できます。Log4j ライブラリーを追加すると、Log4j ログが JBoss Log Manager にルーティングされます。Log4j の依存関係を含める必要はありません。

手順

  • log4j2-jboss-logmanager ライブラリーをプロジェクトの pom.xml ファイルの依存関係として追加します。

pom.xml

    <dependency>
      <groupId>org.jboss.logmanager</groupId>
      <artifactId>log4j2-jboss-logmanager</artifactId>
    </dependency>

log4j2-jboss-logmanager は Log4J バージョン 2 API のライブラリーです。レガシーの Log4J バージョン 1 API を使用する場合は、代わりに log4j-jboss-logmanager を追加する必要があります。

関連情報

1.2. ロギングアダプターの使用

Quarkus は、すべてのロギング要件に関して JBoss Logging ライブラリーに依存します。

Apache Commons Logging、Log4j、SLF4j などの他のロギングライブラリーの依存関係を持つライブラリーを使用している場合は、これらのロギングライブラリーを依存関係から除外し、JBoss Logging が提供するアダプターのいずれかを使用する必要があります。Quarkus エクステンションの依存関係であるライブラリー用のアダプターを追加する必要はありません。

注記

サードパーティーのロギングの実装は、ネイティブの実行可能ファイルに含まれていないため、アプリケーションがコンパイルに失敗し、次のようなエラーメッセージが表示される場合があります。

Caused by java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl

使用するサードパーティーのロギング実装用に JBoss Logging アダプターを設定することで、このエラーを防ぐことができます。

手順

  • 使用しているロギングライブラリーに応じて、アダプターのいずれかを pom.xml ファイルに追加します。

    • Apache Commons Logging:

      pom.xml

      <dependency>
          <groupId>org.jboss.logging</groupId>
          <artifactId>commons-logging-jboss-logging</artifactId>
      </dependency>

    • Log4j:

      pom.xml

      <dependency>
          <groupId>org.jboss.logmanager</groupId>
          <artifactId>log4j-jboss-logmanager</artifactId>
      </dependency>

    • Log4j2:

      pom.xml

      <dependency>
          <groupId>org.jboss.logmanager</groupId>
          <artifactId>log4j2-jboss-logmanager</artifactId>
      </dependency>

    • SLF4j:

      pom.xml

      <dependency>
          <groupId>org.jboss.slf4j</groupId>
          <artifactId>slf4j-jboss-logmanager</artifactId>
      </dependency>

第2章 アプリケーションの JBoss Logging を有効にする

JBoss Logging を使用してアプリケーションログを収集する場合は、ログを生成する各クラスにロガーを追加する必要があります。次の手順は、API アプローチを使用してプログラムで、またはアノテーションを使用して宣言的に、アプリケーションにロギングを追加する方法を示しています。

手順

  1. アプリケーションコードに応じて、次のいずれかの方法を使用します。

    1. org.jboss.logging.Logger のインスタンスを作成し、各クラスの静的メソッド Logger.getLogger(Class) を呼び出して初期化します。

      src/main/java/org/acme/ExampleResource.java

      import org.jboss.logging.Logger; 1
      
      import javax.ws.rs.GET;
      import javax.ws.rs.Path;
      import javax.ws.rs.Produces;
      import javax.ws.rs.core.MediaType;
      
      @Path("/hello")
      public class ExampleResource {
      
          private static final Logger LOG = Logger.getLogger(ExampleResource.class); 2
      
          @GET
          @Produces(MediaType.TEXT_PLAIN)
          public String hello() {
              LOG.info("Hello"); 3
              return "hello";
          }
      }

      1
      使用するクラスの namespace ごとに org.jboss.logging.Logger import ステートメントを追加します。
      2
      各クラスのロガー singleton への参照を追加します。
      3
      ログメッセージのロギングレベルを設定します。
    2. bean およびリソースクラスに、設定した org.jboss.logging.Logger インスタンスを注入します。

      src/main/java/org/acme/ExampleResource.java

      import javax.inject.Inject;
      import javax.ws.rs.GET;
      import javax.ws.rs.Path;
      import javax.ws.rs.Produces;
      import javax.ws.rs.core.MediaType;
      
      import org.jboss.logging.Logger; 1
      
      import io.quarkus.arc.log.LoggerName;
      
      @Path("/hello")
      public class ExampleResource {
      
          @Inject
          Logger log; 2
      
          @LoggerName("foo")
          Logger fooLog; 3
      
          @GET
          @Produces(MediaType.TEXT_PLAIN)
          public String hello() {
              log.info("Simple!");
              fooLog.info("Goes to foo logger!");
              return "hello";
          }
      }

      1
      使用するクラスの namespace ごとに org.jboss.logging.Logger import ステートメントを追加します。
      2
      宣言するクラスの完全修飾クラス名は、初期化ステートメント org.jboss.logging.Logger.getLogger(ExampleResource.class) と同等のロガー名として使用されます。
      3
      ロガーの名前を設定します。この例では、ロガー名は foo で、初期化ステートメント org.jboss.logging.Logger.getLogger("foo") に相当します。
      注記

      ロガーインスタンスは内部的にキャッシュされます。Bean に注入するロガーは、すべての Bean インスタンスで共有され、ロガーのインスタンス化に関連するパフォーマンスの低下を回避します。

  2. (オプション) application.properties ファイルでロギング出力を設定します。

    src/main/resources/application.properties

    <configuration_key>=<value>

    たとえば、ログファイルを作成し、出力結果をコンソールとファイルに出力できます。

    src/main/resources/application.properties

    quarkus.log.file.enable=true
    quarkus.log.file.path=/tmp/trace.log

  3. アプリケーションを開発モードで実行します。

    ./mvnw quarkus:dev
  4. http://localhost:8080/hello を参照します。
  5. 設定に応じて、端末またはログファイルでログメッセージを確認します。

    ロギングレベルが INFO に 設定された ExampleResource.class の出力例:

    2021-05-21 15:38:39,751 INFO  [io.quarkus] (Quarkus Main Thread) my-project my-version on JVM (powered by Quarkus 1.13.3.Final) started in 1.189s. Listening on: http://localhost:8080
    2021-05-21 15:38:39,765 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
    2021-05-21 15:38:39,766 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy]
    2021-05-21 15:38:58,790 INFO  [ExampleResource] (executor-thread-1) Hello

第3章 ランタイム設定の設定

application.properties ファイルで、ロギングレベルおよびロギングカテゴリーを設定できます。

ロギングカテゴリーは階層的です。カテゴリーのロギングレベルを設定すると、設定はそのカテゴリーのすべてのサブカテゴリーに適用されます。

ロギングレベル設定には、ロギングレベルと最小ロギングレベルの 2 つがあります。デフォルトのロギングレベルは INFO で、デフォルトの最小ロギングレベルは DEBUG です。quarkus.log.level および quarkus.log.min-level プロパティーまたはカテゴリーを使用して、グローバルで調整できます。

ロギングレベルを最小ロギングレベルより低く設定する場合は、最小ロギングレベルも調整する必要があります。そうしないと、最小ロギングレベルの値がロギングレベルをオーバーライドします。

過度のロギングは、パフォーマンスに影響を与えます。最小ロギングレベルを調整して、アプリケーションに関連するデータのみを収集できます。ログボリュームを減らすと、メモリー使用量が最適化され、アプリケーションのパフォーマンスが向上する可能性があります。たとえば、ネイティブ実行では、最小レベルにより、低いレベルのチェック (isTraceEnabled) を false に折りたたむことができます。これにより、デッドコードが削除されます。

手順

  • application.properties ファイルでロギング出力を設定します。

    src/main/resources/application.properties

    <configuration_key>=<value>

    以下の例は、デフォルトのロギングレベルを INFO ロギングに設定し、Hibernate DEBUG ログを含める方法を示しています。

    src/main/resources/application.properties

    quarkus.log.level=INFO
    quarkus.log.category."org.hibernate".level=DEBUG

    注記

    コマンドラインで設定プロパティーを設定する場合は、" をエスケープしてください。たとえば、-Dquarkus.log.category.\"org.hibernate\".level=TRACE です。

3.1. ロギング形式の設定

Quarkus は、人間が判読できるテキストログを生成するパターンベースのロギングフォーマッターを使用します。ログエントリーには、タイムスタンプ、ロギングレベル、クラス名、スレッド ID、およびメッセージが表示されます。専用の設定プロパティーを使用して、各ログハンドラーの形式をカスタマイズできます。

前提条件

  • Quarkus Maven プロジェクトがある。

手順

  • quarkus.log.console.format の値を設定して、コンソールハンドラーを設定します。

    src/main/resources/application.properties

    quarkus.log.console.format=<logging_format_string>

    src/main/resources/application.properties

    quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n

    この設定により、ログメッセージのフォーマットは以下のようになります。

    14:11:07 INFO  [ExampleResource] (executor-thread-199) Hello

3.1.1. ロギング形式の文字列

次の表に、ログメッセージの形式を設定するために使用できるロギング形式の文字列記号を示します。

表3.1 サポートされているロギング形式の記号

Symbol概要説明

%%

%

単純な % 文字

%c

カテゴリー

カテゴリー名

%C

ソースクラス

ソースクラス名[a]

%d{xxx}

日付

java.text.SimpleDateFormat に従った、指定された日付形式文字列の日付

%e

例外

例外スタックトレース

%F

ソースファイル

ソースファイル名 [a]

%h

ホスト名

システムのシンプルなホスト名

%H

修飾ホスト名

システムの完全修飾ホスト名。OS の設定によっては、シンプルなホスト名と同じになる場合があります。

%i

プロセス ID

現在のプロセス PID

%l

ソースの場所

ソースの場所 (ソースファイル名、行番号、クラス名、およびメソッド名) [a]

%L

ソース行

ソース行番号 [a]

%m

フルメッセージ

ログメッセージ (例外トレースを含む)

%M

ソースメソッド

ソースメソッド名 [a]

%n

改行

プラットフォーム固有の行区切り文字列

%N

プロセス名

現在のプロセスの名前

%p

レベル

メッセージのロギングレベル

%r

相対時間

アプリケーションログの開始からの相対時間 (ミリ秒単位)

%s

シンプルなメッセージ

例外トレースのないログメッセージ

%t

スレッド名

スレッド名

%t{id}

スレッド ID

スレッド ID

%z{<zone name>}

タイムゾーン

<zone name> 形式の出力のタイムゾーン

%X{<MDC property name>}

マップされた診断コンテキスト値

マップされた診断コンテキストからの値

%X

マップされた診断コンテキスト値

{property.key=property.value} 形式のマップされた診断コンテキストからのすべての値

%x

ネスト化された診断コンテキスト値

ネスト化された診断コンテキストからのすべての値 ({value1.value2} の形式)

[a] 呼び出し元情報を調べるフォーマットシーケンスは、パフォーマンスに影響を与える可能性があります。

3.2. ロギングカテゴリーの設定

ロギングカテゴリーを使用して、ログメッセージを重大度または属するコンポーネントに基づいて整理できます。各カテゴリーを個別に設定できます。

すべてのカテゴリーで、同じ設定がコンソール、ファイル、および syslog に適用されます。1 つ以上の名前付きハンドラーをカテゴリーにアタッチすることで、設定をオーバーライドできます。

表3.2 ロギングカテゴリーの設定プロパティー

プロパティー名デフォルト説明

quarkus.log.category."<category-name>".level

INFO [a]

<category-name> カテゴリーを設定するレベル。

quarkus.log.category."<category-name>".min-level

DEBUG

<category-name> カテゴリーを設定する最小ロギングレベル。

quarkus.log.category."<category-name>".use-parent-handlers

true

ロガーがその出力を親ロガーに送信できるようにします。

quarkus.log.category."<category-name>".handlers=[<handler>]

[b]

特定のカテゴリーにアタッチするハンドラーの名前。

[a] 一部のエクステンションでは、特定のカテゴリーに対してカスタマイズされたデフォルトのロギングレベルを定義して、ログノイズを減らします。設定でロギングレベルを設定すると、エクステンションで定義されたロギングレベルがオーバーライドされます。
[b] デフォルトでは、設定されたカテゴリーは、root ロガーカテゴリーからアタッチされたすべてのハンドラーを継承します。
注記

プロパティーの名前でロギングカテゴリー名を使用する場合、通常はカテゴリー名の一部であるピリオド (.) をエスケープするために、ログカテゴリー名を二重引用符 (") で囲む必要があります。

3.3. ロギングレベル

ロギングレベルを使用して、重大度または Quarkus アプリケーションの正常性と安定性への影響によって、ログを分類することができます。ロギングレベルを使用すると、純粋に情報を示すイベントから重要なイベントをフィルタリングできます。

表3.3 Quarkus は、次のロギングレベルをサポートします。

ロギングレベル説明

OFF

ロギングをオフにする特別なレベル。

FATAL

重大なサービス障害またはサービス要求を完了できない。

ERROR

要求の大幅な中断または要求に対応できない。

WARN

重大ではないサービスエラーまたは即時の修正を必要としない可能性がある問題。

INFO

サービスライフサイクルイベントまたは重要な関連する非常に低頻度の情報。

DEBUG

デバッグに役立つ可能性がある、ライフサイクルまたは要求にバインドされていないイベントに関する追加情報を伝えるメッセージ。

TRACE

非常に頻繁に発生する可能性のある追加の要求ごとのデバッグ情報を伝えるメッセージ。

ALL

カスタムレベルを含むすべてのメッセージの特別なレベル。

注記

また、java.util.logging パッケージによって記述されるロギングレベル名を使用することもできます。

3.4. root ロガー設定

root ロガーカテゴリーは、ロガー階層の最上位にあります。root ロガーは、サーバーに送信され、ロギングカテゴリーによってキャプチャーされない、指定されたロギングレベル以上のすべてのログメッセージをキャプチャーします。root ロガーカテゴリーは、ロギング設定の最上位で設定されます。

表3.4 root ロガーの設定プロパティー

プロパティー名デフォルト説明

quarkus.log.level

INFO

すべてのロギングカテゴリーのデフォルトのロギングレベル。

quarkus.log.min-level

DEBUG

すべてのロギングカテゴリーのデフォルトの最小ロギングレベル。

3.5. Quarkus ログハンドラー

ログハンドラーは、ログイベントを受信者に送信するロギングコンポーネントです。Quarkus には、次のログハンドラーが含まれています。

Console ログハンドラー
コンソールログハンドラーはデフォルトで有効になっています。アプリケーションのコンソール (通常はシステムの stdout) にすべてのログイベントを出力します。
File ログハンドラー
ファイルログハンドラーはデフォルトで無効になっています。すべてのログイベントをアプリケーションのホスト上のファイルに出力します。ファイルログハンドラーは、ログファイルのローテーションをサポートしています。
Syslog ログハンドラー
Syslog は、Unix 系システムでログメッセージを送信するプロトコルです。syslog プロトコルの仕様は、RFC 5424 で定義されています。

syslog ハンドラーは、すべてのログイベントを syslog サーバーに送信します (デフォルトでは、syslog サーバーはアプリケーションと同じホストで実行されます)。デフォルトでは、syslog ハンドラーは無効になっています。

3.6. ロギング設定の例

このセクションでは、Quarkus プロジェクトのロギングを設定する方法の例を示します。

src/main/resources/application.properties

# Format log messages to have shorter time and shorter category prefixes.
quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n

# Remove color from log messages.
quarkus.log.console.color=false

# Enable console DEBUG logging with the exception of Quarkus logs that have a logging level set to INFO.
quarkus.log.console.level=DEBUG
quarkus.log.category."io.quarkus".level=INFO

src/main/resources/application.properties

# Enable file logging and set a path to the log file.
quarkus.log.file.enable=true
quarkus.log.file.path=/tmp/trace.log

# Enable TRACE log messages in a log file.
quarkus.log.file.level=TRACE

# Set a format for the log file output.
quarkus.log.file.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n

# Set logging level to TRACE for specific categories.
quarkus.log.category."io.quarkus.smallrye.jwt".level=TRACE
quarkus.log.category."io.undertow.request.security".level=TRACE

注記

デフォルトでは、root ロガーレベルは INFO に設定されています。DEBUG または TRACE などの低いレベルのログを収集する場合は、root ロガーの設定を変更する必要があります。

src/main/resources/application.properties

# Set path to the log file.
quarkus.log.file.path=/tmp/trace.log

# Configure console format.
quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n

# Configure a console log handler.
quarkus.log.handler.console."STRUCTURED_LOGGING".format=%e%n

# Configure a file log handler.
quarkus.log.handler.file."STRUCTURED_LOGGING_FILE".enable=true
quarkus.log.handler.file."STRUCTURED_LOGGING_FILE".format=%e%n

# Configure the category and associate it with the two named handlers.
quarkus.log.category."io.quarkus.category".level=INFO
quarkus.log.category."io.quarkus.category".handlers=STRUCTURED_LOGGING,STRUCTURED_LOGGING_FILE

第4章 JSON ロギング形式の設定

コンソールログの出力形式を JSON に変更して、後で分析するためにログ情報を処理および保存しやすくすることができます。

JSON ロギング形式を設定するには、quarkus-logging-json エクステンションを Quarkus プロジェクトに追加する必要があります。コンソール設定の出力形式設定を quarkus-logging-json エクステンションに置き換えます。フォーマット文字列や色設定などのコンソール設定項目は無視されます。非同期ロギングやロギングレベルを制御するものなど、その他のコンソール設定項目は引き続き適用されます。

手順

  1. quarkus-logging-json エクステンションをアプリケーションの pom.xml ファイルに追加します。

    pom.xml

      <dependencies>
        <!-- ... your other dependencies are here ... -->
        <dependency>
          <groupId>io.quarkus</groupId>
          <artifactId>quarkus-logging-json</artifactId>
        </dependency>
      </dependencies>

  2. (オプション) application.properties ファイルの JSON ロギング用のプロファイル固有の設定を行います。

    src/main/resources/application.properties

    %<profile>.<configuration_key>=<value>

    次の例は、開発プロファイルとテストプロファイルの JSON ロギングを無効にする方法を示しています。

    src/main/resources/application.properties

    %dev.quarkus.log.console.json=false
    %test.quarkus.log.console.json=false

4.1. JSON ロギング設定プロパティー

次の設定プロパティーを使用して、JSON ロギングエクステンションを設定できます。

表4.1 JSON 設定プロパティー

設定プロパティー説明デフォルト

quarkus.log.console.json

JSON コンソールのフォーマットエクステンションを有効にします。

boolean

true

quarkus.log.console.json.pretty-print

JSON レコードのプリティープリントを有効にします。[a]

boolean

false

quarkus.log.console.json.date-format

日付の形式。default 文字列は、使用するデフォルトの形式を設定します。

string

default

quarkus.log.console.json.record-delimiter

特別な記録終了区切り文字。デフォルトでは、改行が区切り文字として使用されます。

string

 

quarkus.log.console.json.zone-id

ゾーンの ID。default の文字列は、使用されるデフォルトのゾーンを設定します。

string

default

quarkus.log.console.json.exception-output-type

例外の出力タイプ。

detailed, formatted, detailed-and-formatted

detailed

quarkus.log.console.json.print-details

ログの詳細な出力を有効にします。詳細には、ソースクラス名、ソースファイル名、ソースメソッド名、およびソース行番号が含まれます。[b]

boolean

false

[a] 一部のプロセッサーと JSON パーサーは、プリティープリントの出力を読み取れない場合があります。
[b] 値は呼び出し元から取得されるため、詳細の出力はリソースを多く使用する可能性があります。

第5章 @QuarkusTest のロギング設定

@QuarkusTest のロギングを設定する場合は、それに応じて maven-surefire-plugin を設定する必要があります。java.util.logging.manager システムプロパティーを使用して LogManager を指定する必要があります。

手順

  • java.util.logging.manager システムプロパティーを使用して LogManager を設定します。

    pom.xml

    <build>
      <plugins>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>${surefire-plugin.version}</version>
          <configuration>
            <systemPropertyVariables>
              <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> 1
              <quarkus.log.level>DEBUG</quarkus.log.level>  2
              <maven.home>${maven.home}</maven.home>
            </systemPropertyVariables>
          </configuration>
        </plugin>
      </plugins>
    </build>

    1
    org.jboss.logmanager.LogManager を追加します。
    2
    すべてのロギングカテゴリーのデバッグロギングを有効にします。

第6章 関連情報

改訂日時: 2023-05-16

法律上の通知

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.