

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ログ記録
<a name="windows-logging"></a>

コンテナ化されたアプリケーションは通常、アプリケーションログを STDOUT に送信します。コンテナランタイムはこれらのログをトラップし、何らかの操作を行います。通常、 は ファイルに書き込みます。これらのファイルが保存される場所は、コンテナのランタイムと設定によって異なります。

Windows ポッドの基本的な違いの 1 つは、STDOUT を生成しないことです。[LogMonitor](https://github.com/microsoft/windows-container-tools/tree/master/LogMonitor) を実行して、実行中の Windows コンテナとパイプから ETW (Event Tracing for Windows)、Windows イベントログ、その他のアプリケーション固有のログを STDOUT に出力できます。これらのログは、fluent-bit または fluentd を使用して Amazon CloudWatch などの目的の宛先にストリーミングできます。

ログ収集メカニズムは、Kubernetes ポッドから STDOUT/STDERR ログを取得します。[DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) は、コンテナからログを収集する一般的な方法です。これにより、アプリケーションとは独立してログのrouting/filtering/enrichmentを管理できます。流暢な DaemonSet を使用して、これらのログやその他のアプリケーション生成ログを目的のログアグリゲータにストリーミングできます。

Windows ワークロードから CloudWatch へのログストリーミングの詳細については、[こちら](https://aws.amazon.com/blogs/containers/streaming-logs-from-amazon-eks-windows-pods-to-amazon-cloudwatch-logs-using-fluentd/)を参照してください。

## レコメンデーションのログ記録
<a name="_logging_recomendations"></a>

Kubernetes で Windows ワークロードを運用する場合、一般的なログ記録のベストプラクティスに違いはありません。
+ **構造化ログエントリ** (JSON/SYSLOG) を常にログに記録します。これにより、このような構造化形式には事前に記述されたパーサーが多数あるため、ログエントリの処理が容易になります。
+  ログ**を一元化**する - 専用ログコンテナは、特にすべてのコンテナからログメッセージを収集して送信先に転送するために使用できます。
+ デバッグ時を除いて**、ログの詳細度**を低く保ちます。冗長性により、ログ記録インフラストラクチャに大きなストレスがかかり、大きなイベントがノイズで失われる可能性があります。
+ トレーサビリティのために、アプリケーション**情報**と**トランザクション/リクエスト ID **を常にログに記録します。Kubernetes オブジェクトにはアプリケーション名が含まれていないため、たとえば、ログをデバッグするときにポッド名に意味がない`windows-twryrqyw`場合があります。これにより、集約ログを使用したアプリケーションのトレーサビリティとトラブルシューティングに役立ちます。

  これらのトランザクション/相関 ID の生成方法は、プログラミングコンストラクトによって異なります。ただし、非常に一般的なパターンは、ログ記録 Aspect/Interceptor を使用することです。これにより、[MDC](https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html) (マッピングされた診断コンテキスト) を使用して、次のようなすべての受信リクエストに一意のトランザクション/相関 ID を挿入できます。

```
import org.slf4j.MDC;
import java.util.UUID;
Class LoggingAspect { //interceptor

    @Before(value = "execution(* *.*(..))")
    func before(...) {
        transactionId = generateTransactionId();
        MDC.put(CORRELATION_ID, transactionId);
    }

    func generateTransactionId() {
        return UUID.randomUUID().toString();
    }
}
```