Logtail では、コンテナの標準出力ストリームを入力ソースとして使用し、標準出力ストリームをコンテナメタデータと一緒に Log Service にアップロードすることができます。

機能の特徴

  • stdout と stderr の収集をサポートします。
  • ラベルを使用して収集するコンテナを指定することをサポートします。
  • ラベルを使用して特定のコンテナを除外することをサポートします。
  • environments を使用して収集するコンテナを指定することをサポートします。
  • environments を使用して収集するコンテナを除外することをサポートします。
  • 複数行ログ(Java スタックログなど)をサポートします。
  • コンテナデータの自動タグ付けをサポートします。
  • Kubernetes コンテナの自動タグ付けをサポートします。

実装の原則

次の図に示すように、Logtail は Docker の Domain Socket と通信し、 Docker 上で実行されているすべてのコンテナを照会し、ラベル情報に従って収集するコンテナを特定します。 Logtail は、Docker log コマンドを使用して、指定されたコンテナログを取得します。

Logtail は、コンテナの標準出力を収集するときに定期的に収集したポイント情報をチェックポイントファイルに保存します。 Logtail が停止後に再起動されると、ログは最後に保存されたポイントから収集されます。

図 1. 実装の原則


制限

  • 現在、この機能は Linux のみをサポートしており、Logtail 0.16.0 以降のバージョンに依存しています。 バージョンの確認とアップグレードについては、Logtail の Linux へのインストールをご参照ください。
  • デフォルトでは、Logtail は/var/run/docker.sockを使用して Docker Engine にアクセスします。 ドメインソケットが存在し、アクセス権があることを確認します。
  • 複数行ログの制限。 複数の行で構成されるログが出力遅延のために分割されないようにするため、最後に収集された複数行のログはデフォルトで短時間キャッシュされます。 デフォルトのキャッシュ時間は 3 秒ですが、BeginLineTimeoutMsパラメータを使用して変更できます。 ただし、この値は 1000 未満にすることはできません。 そうしないと、エラーが発生する可能性があります。
  • 収集を停止するための戦略。 コンテナが停止すると、Logtail はコンテナの die イベントをリスニング後、コンテナからの標準出力の収集を停止します。 この間に収集遅延が発生すると、停止前に出力の一部を失う可能性があります。
  • Context limit。 デフォルトでは、コレクション構成は同じコンテキストにあります。 コンテナの各タイプごとに異なるコンテキストを設定するには、各タイプの収集設定を作成します。
  • データ処理。収集されたデータのデフォルトのフィールドは content で、これは共通の処理設定をサポートします。
  • Label。 Label は、Docker 検査のラベル情報であり、Kubernetes 構成のラベルではありません。
  • Environment。Environment は、コンテナの起動時に構成された環境情報です。

構成プロセス

  1. Logtail コンテナをデプロイして構成します。
  2. ログサービスで収集の構成を行います。

1.Logtail コンテナをデプロイして構成する

  • Kubernetes
  • その他コンテナ管理方法

2.ログサービスで収集の構成を行う

  1. Logstore List ページで、Data Import Wizard アイコンをクリックし、設定プロセスに入ります。
  2. データソースを選択します。

    サードパーティ製ソフトウェアDocker Stdout を選択してから、Next をクリックします。

  3. データソースを設定します。

    データソースの設定ページで、コレクションの設定を完了します。 次の例をご参照ください。

    {
     "inputs": [
         {
             "type": "service_docker_stdout",
             "detail": {
                 "Stdout": true,
                 "Stderr": true,
                 "IncludeLabel": {
                     "io.kubernetes.container.name": "nginx"
                 },
                 "ExcludeLabel": {
                     "io.kubernetes.container.name": "nginx-ingress-controller"
                 },
                 "IncludeEnv": {
                     "NGINX_SERVICE_PORT": "80"
                 },
                 "ExcludeEnv": {
                     "POD_NAMESPACE": "kube-system"
                 }
             }
         }
     ]
    }
  4. マシングループに適用します。

    マシングループに適用ページで、収集する Logtail マシングループの作成 を選択し、マシングループに適用をクリックして、選択したマシングループに設定を適用します。マシングループを作成していない場合は、マシングループの作成をクリックしてマシングループを作成します。

構成項目の説明

入力ソースタイプは service_docker_stdout です。

設定項目 必須 説明
IncludeLabel マッピングタイプ。キーと値の両方がStringです。 はい デフォルトでは空です。 空の場合、すべてのコンテナが収集されます。 キーが空ではなく値が空の場合、ラベルにこのキーが含まれているすべてのコンテナが収集されます。
  1. キーと値のペアには OR 関係があります。つまり、ラベルにキーと値のペアが含まれていればコンテナが収集されます。
  2. ここで、ラベルは Docker inspect のラベル情報です。
ExcludeLabel マッピングタイプ。キーと値の両方が String です。 いいえ デフォルトでは空です。 空の場合、コンテナは除外されません。 キーが空ではなく値が空の場合、ラベルにこのキーが含まれるすべてのコンテナが除外されます。
  1. キーと値のペアには互いに OR 関係があります。 つまり、ラベルにキーと値のペアが含まれている場合、コンテナは除外されます。
  2. ここで、ラベルは Docker inspect のラベル情報です。
IncludeEnv マッピングタイプ。キーと値の両方が String です。 いいえ デフォルトでは空です 空の場合、すべてのコンテナが収集されます。 キーが空ではなく値が空の場合、このキーを含む環境を持つすべてのコンテナが収集されます。
  1. キーと値のペアは相互に OR 関係を持ちます。つまり、環境にキー/値のペアが含まれている場合、コンテナが収集されます。
  2. 環境は、コンテナの起動時に構成された環境情報です。
ExcludeEnv マッピングタイプ。キーと値の両方が String です。 いいえ デフォルトでは空です 空の場合、コンテナは除外されません。 キーが空ではなく値が空の場合、このキーを含む環境を持つすべてのコンテナが除外されます。
  1. キーと値のペアには OR 関係があります。つまり、環境にキーと値のペアが含まれている場合、コンテナは除外されます。
  2. 環境は、コンテナの起動時に構成された環境情報です。
Stdout ブール いいえ デフォルトでは True です。 false の場合、stdout データは収集されません。
Stderr ブール いいえ デフォルトでは True です。 false の場合、stderr データは収集されません。
BeginLineRegex String いいえ デフォルトでは空です。 空でない場合は、行の先頭に一致する正規表現です。 この正規表現が行と一致する場合、その行は新しいログとして扱われます。 それ以外の場合、データの行は前のログに接続されます。
BeginLineTimeoutMs int いいえ 行の先頭と一致するためのタイムアウト(ミリ秒単位)。デフォルト値は 3000 です。 新しいログが 3 秒以内に表示されない場合は、最後のログが出力されます。
BeginLineCheckLength int いいえ 正規表現との一致に使用される行の先頭の長さ(バイト単位)。 デフォルト値は 10 \ 1024 です。 正規表現が最初の N バイト以内の行と一致する場合は、このパラメータを設定して一致効率を上げます。
MaxLogSize int いいえ ログの最大長(バイト単位)。 デフォルト値は 512 \ 1024 です。 ログの長さが設定された値を超えると、一致した行の先頭を検索することなく、ログが直接アップロードされます。

デフォルトフィールド

ノーマルドッカー

次のフィールドは、デフォルトで各ログによってアップロードされます。

フィールド名 説明
_time_ データ時間。 たとえば、2018-02-02T02:18:41.979147844Z となります。
_source_ 入力ソースタイプ(stdout または stderr)。
_image_name_ イメージ名。
_container_name_ コンテナ名。
Kubernetes

クラスタが Kubernetes クラスタの場合、デフォルトで各ログによって次のフィールドがアップロードされます。

フィールド名 説明
_time_ データ時間。 たとえば、2018-02-02T02:18:41.979147844Z となります。
_source_ 入力ソース・タイプ(stdout または stderr のいずれか)。
_image_name_ イメージ名。
_container_name_ コンテナ名。
_pod_name_ ポッド名。
_namespace_ ポッドが存在する名前空間。
_pod_uid_ ポッドの一意の識別子。

設定例

一般的な設定

  • Environment の構成

    Environment が NGINX_PORT_80_TCP_PORT = 80 で、POD_NAMESPACE = kube-system ではないコンテナの stdout ログと stderr ログを収集する:

    Environment は、コンテナの起動時に構成された環境情報です。
    図 2. Environment 構成の例


    収集の構成
    {
        "inputs": [
            {
                "type": "service_docker_stdout",
                "detail": {
                    "Stdout": true,
                    "Stderr": true,
                    "IncludeEnv": {
                        "NGINX_PORT_80_TCP_PORT": "80"
                    },
                    "ExcludeEnv": {
                        "POD_NAMESPACE": "kube-system"
                    }
                }
            }
        ]
    }
  • Label 構成

    Label が io.kubernetes.container.name=nginxtype=pre ではないコンテナの stdout ログと stderr ログを収集します。

    こちらの label は Docker です Kubernetes 構成のラベルではありません。
    図 3. Label 構成の例


    {
        "inputs": [
            {
                "type": "service_docker_stdout",
                "detail": {
                    "Stdout": true,
                    "Stderr": true,
                    "IncludeLabel": {
                        "io.kubernetes.container.name": "nginx"
                    },
                    "ExcludeLabel": {
                        "type": "pre"
                    }
                }
            }
        ]
    }

複数行ログの収集設定

マルチラインログ収集は、Java 例外スタック出力の収集にとって特に重要です。 ここでは、Java 標準出力ログの標準収集設定を紹介します。

  • ログサンプル:
    2018-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start
    2018-02-03 14:18:41.969 ERROR [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : java.lang.NullPointerException
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    ...
    2018-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start done
  • コレクションの構成:

    ラベルが app = monitor で、行の先頭が日付型のコンテナの入力ログを収集する(マッチング効率を上げるために、行の最初の 10 バイトだけが正規表現との一致をチェックするために使用される) 。

    {
    "inputs": [
      {
        "detail": {
          "BeginLineCheckLength": 10,
          "BeginLineRegex": "\\d+-\\d+-\\d+. *",
          "IncludeLabel": {
            "app": "monitor"
          }
        },
        "type": "service_docker_stdout"
      }
    ]
    }

収集したデータを処理する

Logtail は収集された Docker の標準出力に対して common data processing methods をサポートしています。 前のセクションの複数行のログ形式に基づいて、正規表現を使用して時刻、モジュール、スレッド、クラス、および情報のログを解析することをお勧めします。

  • 収集の構成
    ラベルが app = monitor で、行の先頭が日付型のコンテナの入力ログを収集する(マッチング効率を上げるために、行の最初の 10 バイトだけが正規表現との一致をチェックするために使用される)
    {
    "inputs": [
      {
        "detail": {
          "BeginLineCheckLength": 10,
          "BeginLineRegex": "\\d+-\\d+-\\d+. *",
          "IncludeLabel": {
            "app": "monitor"
          }
        },
        "type": "service_docker_stdout"
      }
    ],
    "Processors ":[
        {
            "type": "processor_regex",
            "detail": {
                "SourceKey": "content",
                "Regex": "(\\d+-\\d+-\\d+ \\d+:\\d+:\\d+\\.\\d+)\\s+(\\w+)\\s+\\[([^]]+)]\\s+\\[([^]]+)]\\s+:\\s+(. *)",
                "Keys": [
                    "time",
                    "module",
                    "thread",
                    "class",
                    "info"
                ],
                "NoKeyError": true,
                "NoMatchError": true,
                "KeepSource": false
            }
        }
    ]
    }
  • サンプル出力:

    ログ 2018-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start done を処理した後の出力は、次のようになります。

    __tag__:__hostname__:logtail-dfgef
    _container_name_:monitor
    _image_name_:registry.cn-hangzhou.aliyuncs.xxxxxxxxxxxxxxx
    _namespace_:default
    _pod_name_:monitor-6f54bd5d74-rtzc7
    _pod_uid_:7f012b72-04c7-11e8-84aa-00163f00c369
    _source_:stdout
    _time_:2018-02-02T14:18:41.979147844Z
    Time: 2018-02-02 02:18:41. 968
    level:INFO
    module:spring-cloud-monitor
    Thread: fig
    Class: c.g.s. web. Controller. demcontroller
    message:service start done