Logtail では、コンテナの標準出力ストリームを入力ソースとして使用し、標準出力ストリームをコンテナメタデータと一緒に Log Service にアップロードすることができます。
機能の特徴
- stdout と stderr の収集をサポートします。
- ラベルを使用して収集するコンテナを指定することをサポートします。
- ラベルを使用して特定のコンテナを除外することをサポートします。
- environments を使用して収集するコンテナを指定することをサポートします。
- environments を使用して収集するコンテナを除外することをサポートします。
- 複数行ログ(Java スタックログなど)をサポートします。
- コンテナデータの自動タグ付けをサポートします。
- Kubernetes コンテナの自動タグ付けをサポートします。
実装の原則
次の図に示すように、Logtail は Docker の Domain Socket と通信し、 Docker 上で実行されているすべてのコンテナを照会し、ラベル情報に従って収集するコンテナを特定します。 Logtail は、Docker log コマンドを使用して、指定されたコンテナログを取得します。
Logtail は、コンテナの標準出力を収集するときに定期的に収集したポイント情報をチェックポイントファイルに保存します。 Logtail が停止後に再起動されると、ログは最後に保存されたポイントから収集されます。

制限
- 現在、この機能は 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 は、コンテナの起動時に構成された環境情報です。
構成プロセス
- Logtail コンテナをデプロイして構成します。
- ログサービスで収集の構成を行います。
1.Logtail コンテナをデプロイして構成する
- Kubernetes
- その他コンテナ管理方法
2.ログサービスで収集の構成を行う
- Logstore List ページで、Data Import Wizard アイコンをクリックし、設定プロセスに入ります。
- データソースを選択します。
サードパーティ製ソフトウェアの Docker Stdout を選択してから、Next をクリックします。
- データソースを設定します。
データソースの設定ページで、コレクションの設定を完了します。 次の例をご参照ください。
{ "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" } } } ] }
- マシングループに適用します。
マシングループに適用ページで、収集する Logtail マシングループの作成 を選択し、マシングループに適用をクリックして、選択したマシングループに設定を適用します。マシングループを作成していない場合は、マシングループの作成をクリックしてマシングループを作成します。
構成項目の説明
入力ソースタイプは service_docker_stdout
です。
設定項目 | 型 | 必須 | 説明 |
---|---|---|---|
IncludeLabel | マッピングタイプ。キーと値の両方がStringです。 | はい | デフォルトでは空です。 空の場合、すべてのコンテナが収集されます。 キーが空ではなく値が空の場合、ラベルにこのキーが含まれているすべてのコンテナが収集されます。
注
|
ExcludeLabel | マッピングタイプ。キーと値の両方が String です。 | いいえ | デフォルトでは空です。 空の場合、コンテナは除外されません。 キーが空ではなく値が空の場合、ラベルにこのキーが含まれるすべてのコンテナが除外されます。
注
|
IncludeEnv | マッピングタイプ。キーと値の両方が String です。 | いいえ | デフォルトでは空です 空の場合、すべてのコンテナが収集されます。 キーが空ではなく値が空の場合、このキーを含む環境を持つすべてのコンテナが収集されます。
注
|
ExcludeEnv | マッピングタイプ。キーと値の両方が String です。 | いいえ | デフォルトでは空です 空の場合、コンテナは除外されません。 キーが空ではなく値が空の場合、このキーを含む環境を持つすべてのコンテナが除外されます。
注
|
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 クラスタの場合、デフォルトで各ログによって次のフィールドがアップロードされます。
フィールド名 | 説明 |
---|---|
_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=nginx
でtype=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