ログ収集は、デフォルトでコンソールに設定されます。 Log Service では、Kubernetes マイクロサービス開発用のログ収集の CRD 設定も提供します。 これにより、kubectl を使用して設定を管理できます。

この方法は、Kubernetes のデプロイメント、および公開プロセスと連携されているため、収集設定管理に CRD メソッドを使用することを推奨します。

実装の原則

図 1. 実装の原則

インストールコマンドを実行して、 alibaba-log-controllerHelm パッケージをインストールします。 Helm パッケージは、主に次の操作を実行します。

  1. aliyunlogconfigs CRD (カスタムリソース定義) を作成します。
  2. alibaba-log-controller をデプロイします。
  3. Logtail DaemonSet をデプロイします。

設定の内部ワークフローは次のとおりです。

  1. kubectl または他のツールを使用して、aliyunlogconfigs CRD 設定を適用します。
  2. alibaba-log-controller は、設定のアップデートを検出します。
  3. alibaba-log-controller は、CRD の内容とサーバーのステータスに基づき、Logstore の作成、設定の作成、およびマシングループのアプリケーション設定のリクエストを自動的に送信します。
  4. DaemonSet モードで実行される Logtail は、サーバー設定のリクエストを定期的に送信し、新しい設定または更新された設定を取得し、高速ロードを実行します。
  5. Logtail は、設定情報に基づき、各コンテナ (pod) から標準出力またはファイルを収集します。
  6. Logtail は、処理され集められたデータを Log Service に送信します。

設定方法

DaemonSet モードでデプロイされた Logtail を使用した場合、CRD モードでは設定を管理できません。 詳細は、このドキュメントの DaemonSet デプロイメントモードの移行プロセスをご参照ください。
設定を作成するには、AliyunLogConfig の CRD を定義する必要があります。設定を削除するには、対応する CRD リソースを削除する必要があります。 CRD は次のように設定されています。
apiVersion: log.alibabacloud.com/v1alpha1 ## デフォルト値。変更する必要はありません。
kind: AliyunLogConfig ## デフォルト値。変更する必要はありません。
metadata:
  name: simple-stdout-example ## リソース名。ラスター内で一意である必要があります。
spec:
  logstore: k8s-stdout ## Logstore 名。存在しなければ自動的に作成されます。
  shardCount: 2 ## [オプション] Logstore のパーティション数。 デフォルト値は 2 です。 値の範囲は 1〜10 です。
  lifeCycle: 90 ## [オプション] Logstore の保存期間。 デフォルト値は 90 です。 値の範囲は 1〜7300 です。 値 7300 は、永久的な保存を示しています。
  logtailConfig: ## 詳細な設定
    inputType: plugin ## 収集の入力タイプ。 通常、値はファイルかプラグインです。
    configName: simple-stdout-example ## 収集設定名。 値はリソース名 (metadata.name) と同じでなければなりません。
    inputDetail: ## 詳細な設定情報。例をご参照ください。
      ...

設定が完了して適用されると、alibaba-log-controller が自動的に作成されます。

設定の表示

Kubernetes CRD またはコンソールで設定を表示できます。

コンソールでの設定の表示方法については、「Logtail 設定の作成」をご参照ください。
CRD 方式を使用して設定を管理すると、CRD で設定を更新する際、コンソールで行った設定変更が上書きされます。
  • すべての設定を表示するには、 kubectl get aliyunlogconfigs を実行します。
    [root@iZbp1dsbiaZ ~]# kubectl get aliyunlogconfigs
    NAME AGE
    regex-file-example 10s
    regex-stdout-example 4h
    simple-file-example 5s
  • 詳細な設定とステータスを表示するには、kubectl get aliyunlogconfigs ${configname} -o yaml を実行します。

    設定のstatus フィールドには、設定の実行結果が表示されます。 設定が正常に適用された場合、 statusCode の値は status フィールドで 200 になります。 statusCode の値が 200 でない場合、設定の適用に失敗しています。

    [root@iZbp1dsbiaZ ~]# kubectl get aliyunlogconfigs simple-file-example -o yaml
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        
    clusterName: ""
    creationTimestamp: 2018-05-17T08:44:46Z
    generation: 0
    name: simple-file-example
    namespace: default
    resourceVersion: "21790443"
    selfLink: /apis/log.alibabacloud.com/v1alpha1/namespaces/default/aliyunlogconfigs/simple-file-example
    uid: 8d3a09c4-59ae-11e8-851d-00163f008685
    spec:
    lifeCycle: null
    logstore: k8s-file
    logtailConfig:
      configName: simple-file-example
      inputDetail:
        dockerFile: true
        dockerIncludeEnv:
          ALIYUN_LOGTAIL_USER_DEFINED_ID: ""
        filePattern: simple.LOG
        logPath: /usr/local/ilogtail
        logType: common_reg_log
      inputType: file
    machineGroups: null
    project: ""
    shardCount: null
    status:
    status: OK
    statusCode: 200

設定例

コンテナ標準出力

コンテナ標準出力では、inputTypeplugin に設定します。inputDetailplugin フィールドの詳細情報を入力します 。 設定フィールドの詳細については、「コンテナ標準出力」をご参照ください。

  • シンプル収集モード

    環境変数の設定 COLLECT_STDOUT_FLAG=false があるコンテナを除く、すべてのコンテナの標準出力 (stdout と stdeer) を収集します。

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # your config name, must be unique in your k8s cluster
      name: simple-stdout-example
    spec:
      # logstore name to upload log
      logstore: k8s-stdout
      # logtail config detail
      logtailConfig:
        # docker stdout's input type is 'plugin'
        inputType: plugin
        # logtail config name, should be same with [metadata.name]
        configName: simple-stdout-example
        inputDetail:
          plugin:
            inputs:
              -
                # input type
                type: service_docker_stdout
                detail:
                  # collect stdout and stderr
                  Stdout: true
                  Stderr: true
                  # collect all container's stdout except containers with "COLLECT_STDOUT_FLAG:false" in docker env config
                  ExcludeEnv:
                    COLLECT_STDOUT_FLAG: "false"
  • カスタム収集モード

    Grafana のアクセスログを収集し、アクセスログを構造化データに解析します。

    Grafana コンテナには環境変数 GF_INSTALL_PLUGINS=grafana-piechart-…. の設定があります。 Logtail がこのコンテナのみから標準出力を収集できるように IncludeEnvGF_INSTALL_PLUGINS: ‘’ に設定できます。
    図 2. カスタム収集モード
    Grafana のアクセスログの形式は次のとおりです。
    t=2018-03-09T07:14:03+0000 lvl=info msg="Request Completed" logger=context userId=0 orgId=0 uname= method=GET path=/ status=302 remote_addr=172.16.64.154 time_ms=0 size=29 referer=
    正規表現を使用してアクセスログを解析します。 詳細な設定は次のとおりです。
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # your config name, must be unique in your k8s cluster
      name: regex-stdout-example
    spec:
      # logstore name to upload log
      logstore: k8s-stdout-regex
      # logtail config detail
      logtailConfig:
        # docker stdouts input type is plugin
        inputType: plugin
        # logtail config name, should be same with [metadata.name]
        configName: regex-stdout-example
        inputDetail:
          plugin:
            inputs:
              -
                # input type
                type: service_docker_stdout
                detail:
                  # stdout 出力のみを収集し、stdeer 出力は収集しません。
                  Stdout: true
                  Stderr: false
                  # コンテナの環境変数設定でキーが “GF_INSTALL_PLUGINS” である stdout 出力のみを収集します。 
                  IncludeEnv:
                    GF_INSTALL_PLUGINS: ''
            processors:
              -
                # 正規表現を使用します。
                type: processor_regex
                detail:
                  # docker によって収集されたデータには、デフォルトで、キー “コンテンツ” があります。
                  SourceKey: content
                  # 抽出の正規表現
                  Regex: 't=(\d+-\d+-\w+:\d+:\d+\+\d+) lvl=(\w+) msg="([^"]+)" logger=(\w+) userId=(\w+) orgId=(\w+) uname=(\S*) method=(\w+) path=(\S+) status=(\d+) remote_addr=(\S+) time_ms=(\d+) size=(\d+) referer=(\S*). *'
                  # 抽出されたキー
                  Keys: ['time', 'level', 'message', 'logger', 'userId', 'orgId', 'uname', 'method', 'path', 'status', 'remote_addr', 'time_ms', 'size', 'referer']
                  # 元のフィールドを保持します。
                  KeepSource: true
                  NoKeyError: true
                  NoMatchError: true
    設定が適用されると、 Log Service によって収集されるデータは次のようになります。
    図 3. 収集されるログデータ

コンテナファイル

  • シンプルファイル
    環境変数設定にキー ALIYUN_LOGTAIL_USER_DEFINED_ID が含まれるコンテナからログファイルを収集します。 ログファイルのパスは/data/logs/app_1で、ファイル名は simple.LOG です。
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # your config name, must be unique in your k8s cluster
      name: simple-file-example
    spec:
      # logstore name to upload log
      logstore: k8s-file
      # logtail config detail
      logtailConfig:
        # log file's input type is 'file'
        inputType: file
        # logtail config name, must same with [metadata.name]
        configName: simple-file-example
        inputDetail:
          # 正規表現型のログについては、logType を “common_reg_log”に設定します。
          logType: common_reg_log
          # ログファイルフォルダ
          logPath: /data/logs/app_1
          # ワイルドカードをサポートするファイル名。たとえば、log.log
          filePattern: simple.LOG
          # コンテナからファイルを収集します。dockerFile フラグは true に設定されています。
          dockerFile: true
          # Only collect container with "ALIYUN_LOGTAIL_USER_DEFINED_ID" in docker env config
          dockerIncludeEnv:
            ALIYUN_LOGTAIL_USER_DEFINED_ID: ""
  • 正規表現ファイルを完成する
    Java プログラムログの例を次に示します。
    [2018-05-11T20:10:16,000] [INFO] [SessionTracker] [SessionTrackerImpl.java:148] Expiring sessions
    java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x8F",...' for column 'data' at row 1
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
    at org.springframework.jdbc.support.AbstractFallbackSQLException
    ログにはエラースタック情報が含まれているため、ログエントリは複数の行に分割されることがあります。 したがって、行の先頭に正規表現を設定する必要があります。 各フィールドを抽出するには、正規表現を使用します。 設定の詳細は次のとおりです。
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # your config name, must be unique in your k8s cluster
      name: regex-file-example
    spec:
      # logstore name to upload log
      logstore: k8s-file
      logtailConfig:
        # log file's input type is 'file'
        inputType: file
        # logtail config name, should be same with [metadata.name]
        configName: regex-file-example
        inputDetail:
          # 正規表現型のログについては、logType を “common_reg_log” に設定します。
          logType: common_reg_log
          # ログファイルフォルダ
          logPath: /app/logs
          # ワイルドカードをサポートするファイル名。たとえば、log.log
          filePattern: error.LOG
          # 最初の行の正規表現
          logBeginRegex: '\[\d+-\d+-\w+:\d+:\d+,\d+]\s\[\w+]\s. *'
          # 正規表現を解析します。
          regex: '\[([^]]+)]\s\[(\w+)]\s\[(\w+)]\s\[([^:]+):(\d+)]\s(. *)'
          # 抽出されたキーのリスト
          key : ["time", "level", "method", "file", "line", "message"]
          # 正規表現のログ。 ログの timeはデフォルトで時間解析のために抽出されます。 時間が必要ない場合は、フィールドを無視します。
          timeFormat: '%Y-%m-%dT%H:%M:%S'
          # コンテナからファイルを収集します。dockerFile フラグは true に設定されています。
          dockerFile: true
          # Only collect container with "ALIYUN_LOGTAIL_USER_DEFINED_ID" in docker env config
          dockerIncludeEnv:
            ALIYUN_LOGTAIL_USER_DEFINED_ID: ""
    設定が適用されると、 Log Service によって収集されるデータは次のようになります。
    図 4. 収集されるログデータ
  • 区切り文字パターンファイル
    Logtail は、区切り文字モードでのログ解析をサポートしています。例は次のとおりです。
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # your config name, must be unique in your k8s cluster
      name: delimiter-file-example
    spec:
      # logstore name to upload log
      logstore: k8s-file
      logtailConfig:
        # log file's input type is 'file'
        inputType: file
        configName: delimiter-file-example
        # logtail config name, should be same with [metadata.name]
        inputDetail:
          # 区切り文字タイプのログの場合は、logType を delimiter_log に設定します。
          logType: delimiter_log
          # ログファイルフォルダ
          logPath: /usr/local/ilogtail
          # ワイルドカードをサポートするファイル名。たとえば、 log.log
          filePattern: delimiter_log.LOG
          # 複数文字の区切り文字を使用します。
          separator: '|&|'
          # 抽出されたキーのリスト
          key : ['time', 'level', 'method', 'file', 'line', 'message']
          # 解析時間のキー。 時間の解析が不要な場合はフィールドを無視します。
          timeKey: 'time'
          # 時間解析メソッド。 時間の解析が不要な場合はフィールドを無視します。
          timeFormat: '%Y-%m-%dT%H:%M:%S'
          # コンテナからファイルを収集します。dockerFile フラグは true に設定されています。
          dockerFile: true
          # Only collect container with "ALIYUN_LOGTAIL_USER_DEFINED_ID" in docker env config
          dockerIncludeEnv:
            ALIYUN_LOGTAIL_USER_DEFINED_ID: ''
  • JSON モードファイル
    ファイル内の各データ行が JSON オブジェクトの場合、JSON メソッドを解析に使用できます。例は次のとおりです。
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # your config name, must be unique in you k8s cluster
      name: json-file-example
    spec:
      # logstore name to upload log
      logstore: k8s-file
      logtailConfig:
        # log file's input type is 'file'
        inputType: file
        # logtail config name, should be same with [metadata.name]
        configName: json-file-example
        inputDetail:
          # 区切り文字タイプのログの場合は、logType を json_log に設定します。
          logType: json_log
          # ログファイルフォルダ
          logPath: /usr/local/ilogtail
          # ワイルドカードをサポートするファイル名。たとえば、log_*.log
          filePattern: json_log.LOG
          # 解析時間のキー。 時間の解析が不要な場合はフィールドを無視します。
          timeKey: 'time'
          # 時間解析メソッド。 時間の解析が不要な場合はフィールドを無視します。
          timeFormat: '%Y-%m-%dT%H:%M:%S'
          # コンテナからファイルを収集します。dockerFile フラグは true に設定されている
          dockerFile: true
          # Only collect container with "ALIYUN_LOGTAIL_USER_DEFINED_ID" in docker env config
          dockerIncludeEnv:
            ALIYUN_LOGTAIL_USER_DEFINED_ID: ""