6. ログ

サーバーアプリケーションのログ出力について解説します。

6.1. ログの確認

ログの確認方法について説明します。

docker compose logs を使用します。 deployment.zip を使用している場合はログを閲覧したいサービスがある docker-compose ファイルを指定します。

docker compose -f <該当するdocker-composeファイル> logs <サービス名>

インターネットからの全アクセスについて確認する場合はNginxのログを参照します。

6.2. ログの種類

6.2.1. アクセスログ

次に示すアプリケーションは統一されたフォーマットのアクセスログを出力します。

  • Broker Service

  • Measurement Service

  • Authentication Service

  • Media Service

  • Webhook Service

  • Data Visualizer Backend Service

# サーバーのHTTPアクセスログの出力例
{"level":"info","ts":"2023-04-18T08:07:59.522094327Z","caller":"loghttp/request.go:33","msg":"Received","user_id":"anonymous","tenant_id":0,"trace_id":"4549-1163-8602","path":"/auth/projects/11e023a2-4f35-4393-aceb-1f8b5acd4841","method":"GET","query_string":"","url":"/auth/projects/11e023a2-4f35-4393-aceb-1f8b5acd4841","ua":"Auth-Client/Gen-By-OASGenerator","referer":"","hostname":"ip-xxx-xx-x-xxx.ap-northeast-1.compute.internal","remote_ip":"127.0.0.1:45862","in_bytes":0,"proto":"HTTP/1.1"}
{"level":"info","ts":"2023-04-18T08:07:59.522561263Z","caller":"loghttp/request.go:47","msg":"Responded","user_id":"anonymous","tenant_id":0,"trace_id":"4549-1163-8602","path":"/auth/projects/11e023a2-4f35-4393-aceb-1f8b5acd4841","status_text":"OK","status":200,"response_millis":0,"out_bytes":211}

特に重要な項目のみ説明します。ここで示す属性は全体の一部です。

属性名

説明

level

info

ログレベル

ts

2023-04-18T08:07:59.522094327Z

UTC時間(RFC3339)

msg

Received

ログメッセージ。

user_id

22f4cff2-f893-4792-ad82-f43a405b5fb7

アクセスしたユーザーのID。サインインしていないユーザー、またはサービスによるアクセスは anonymous

tenant_id

0

アクセスされたテナントのID

ua

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48

ユーザーエージェント

trace_id

4549-1163-8602 または 7f30fe6cdfa7a6ff:7219ebbc4b01f0c6:6e06488ad5904334:1

トレース用のID。この値を使用してHTTPリクエストの一連の流れを識別できる。この値はサービスをまたいだリクエストでも有効。

path

/api/auth/users/f2af6931-4ba1-4ceb-a4e4-373ceedcf5bb

アクセスパス

status

200

レスポンスコード

method

GET

HTTPメソッド

response_millis

1

応答時間(ミリ秒)

in_bytes

1

リクエストボディサイズ

out_bytes

1

レスポンスボディサイズ

インターネットからサーバーアプリケーションへのアクセスを確認するには「API Gateway」のログを見ます。

# API-Gatewayのアクセスログの出力例
{"ClientAddr":"127.0.0.1:23106","ClientHost":"127.0.0.1","ClientPort":"23106","ClientUsername":"-","DownstreamContentSize":0,"DownstreamStatus":0,"Duration":75272189,"OriginContentSize":0,"OriginDuration":75209609,"OriginStatus":0,"Overhead":62580,"RequestAddr":"example.intdash.jp","RequestContentSize":0,"RequestCount":41898,"RequestHost":"example.intdash.jp","RequestMethod":"GET","RequestPath":"/api/iscp/connect?enc=proto","RequestPort":"-","RequestProtocol":"HTTP/1.1","RequestScheme":"http","RetryAttempts":0,"RouterName":"iscp-websocket@file","ServiceAddr":"127.0.0.1:8178","ServiceName":"iscp-websocket@file","ServiceURL":{"Scheme":"http","Opaque":"","User":null,"Host":"127.0.0.1:8178","Path":"/","RawPath":"","OmitHost":false,"ForceQuery":false,"RawQuery":"","Fragment":"","RawFragment":""},"StartLocal":"2023-04-18T07:27:35.708069272Z","StartUTC":"2023-04-18T07:27:35.708069272Z","entryPointName":"web","level":"info","msg":"","time":"2023-04-18T07:27:35Z"}

API GatewayはTraefikを使用しています。Traefikのログについては traefik Access Logs を参照してください。

6.2.2. エラーログ/警告ログ

ログレベルが error の場合は msg を確認し、必要に応じて対応してください。

{"level"=>"error", "ts"=>"2023-04-17T23:00:38.289691344Z", "caller"=>"runtime/asm_amd64.s:1594", "msg"=>"nats: no servers available for connection", "lib-name"=>"stan", "stacktrace"=>"runtime.goexit\n\t/usr/local/go/src/runtime/asm_amd64.s:1594", "tag"=>"app.measurementd.stderr", "eval_message"=>"runtime/asm_amd64.s:1594"}

すべてのエラーログが問題を示しているわけではありません(キャンセル処理や一時的な性能劣化でエラーが出力されることがあります)。 一時的な性能劣化かどうかを見極めたい場合は、ログを出力したアプリケーションの動作をその後も注視してください。

6.2.3. デバッグログ

ログレベルを debug に変更すると、より詳細なログ情報が出力できます。変更の方法は ログの出力 を参照してください。

6.3. ログの管理

6.3.1. ログの出力

ログの出力やフォーマットは設定により変更ができます。

サーバーアプリケーションのログの設定は環境変数で変更することができます。

services:
  <サービス>:
    environment:
      <サービスごとの環境変数プレフィックス>_LOGGER_LEVEL: "info" <----
      <サービスごとの環境変数プレフィックス>_LOGGER_ENCODING: "json" <----

詳細は 設定リファレンス を参照してください。

API Gateway (Traefik)のログレベルも、同様に環境変数で変更することができます。 設定可能な値については Traefik Static Configuration: Environment variables を参照してください。

6.3.2. ログのローテーション

deployment.zip 内のサービスは特にロギングに関する設定はされていません。 必要に応じて、ロギング設定を行ってください。

参考

6.3.3. ログの分析

アプリケーションログは構造化(JSONフォーマット)されています。ログを分析するには grep などに加え、 jq などを使用すると分析に役立てることができます。