6. ログ
サーバーアプリケーションのログ出力について解説します。
6.1. ログの確認
ログの確認方法について説明します。
docker compose logs
を使用します。 deployment.zip を使用している場合はログを閲覧したいサービスがある docker-compose ファイルを指定します。
docker compose -f <該当するdocker-composeファイル> logs <サービス名>
インターネットからの全アクセスについて確認する場合はNginxのログを参照します。
直近のログについてはジャーナルのログ出力コマンドを実行します。
sudo journalctl -u <サービス名> -o cat
注釈
サービス名は次のコマンドで確認します。
sudo systemctl list-unit-files intdash*
インターネットからの全アクセスについて確認する場合はNginxのログを参照します。
tail -f /var/log/nginx/intdash/access.log
また、RPM/AMIで構築された環境では、intdash関連のログはjournalログから /var/log/intdash/<サービス名>_stdout.log
と /var/log/intdash/<サービス名>_stderr.log
にファイル出力されます。
エラーログのみ別ファイルで見たい場合や、journalでは削除されてしまった古いログを参照する場合は /var/log/intdash
以下から確認ができます。
kubectl
のログ出力コマンドを実行します。
kubectl logs -n <名前空間> deployments/<デプロイメント名>
注釈
デプロイメント名は次のコマンドで確認することができます。
kubectl get deploy -n <名前空間> -l "helm.sh/chart=<チャートのバージョン:例 intdash-v1.0.0>
インターネットからの全アクセスについて確認する場合はIngress Controllerのログを確認してください。
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 を参照してください。
サーバーアプリケーションのログの設定は、設定ファイルを書き換えることで変更ができます。
[logger]
level = 'info'
encoding = 'json'
詳細は 設定リファレンス を参照してください。
API Gatewayのログの設定は /etc/intdash/traefik.toml で変更します。
...
[accessLog]
format = "json"
サーバーアプリケーションのログの設定はvalues.yamlファイルで変更することができます。
...
intdashService:
config:
logger:
...
level: info
encoding: json
...
詳細は 設定ファイルリファレンス を参照してください。
API Gatewayのログレベルも同様に values.yamlで変更することができます
intdashApiGateway:
...
extraEnv:
- name: TRAEFIK_ACCESSLOG
value: true
- name: TRAEFIK_ACCESSLOG_FORMAT
value: json
環境変数に設定可能な値については Traefik Static Configuration: Environment variables を参照してください。
6.3.2. ログのローテーション
deployment.zip 内のサービスは特にロギングに関する設定はされていません。 必要に応じて、ロギング設定を行ってください。
参考
journalログについてはOSのデフォルト設定に従います。
RPM/AMIで構築された環境では、intdash関連のログはjournalログから /var/log/intdash/<サービス名>_stdout.log
と /var/log/intdash/<サービス名>_stderr.log
にファイル出力されます。
また、ファイル出力されたログファイルは logrotate
によりローテーションします。
通常デフォルト値で問題はありませんが、必要に応じて logrotate
の設定を変更してください。
vi /etc/logrotate.d/<サービス名>
コンテナログの容量を変更するには、通常ローカルのエフェメラルストレージの設定を変更します。 Deployment の以下の項目を設定してください。
spec.template.spec.containers.resources.requests.ephemeral-storage
spec.template.spec.containers.resources.limits.ephemeral-storage
これらの設定は values.yaml
でも指定が可能です。
# intdashServiceのデプロイメントに対するephemeral-storage設定
intdashService:
...
resources:
requests:
ephemeral-storage: <----
limits:
ephemeral-storage: <----
詳細は Setting requests and limits for local ephemeral storage を参照してください
その他、外部ストレージへのログ出力などは環境に合わせて任意の設定を行ってください。
6.3.3. ログの分析
アプリケーションログは構造化(JSONフォーマット)されています。ログを分析するには grep
などに加え、 jq などを使用すると分析に役立てることができます。