Compute のリモートログストリーミングを設定する

ログは接続の問題についてのトラブルシューティングや、パフォーマンスチューニングのために設定すべき項目の特定、サービス障害の原因特定の際の重要な情報源となります。Fastly サービスの利用を開始する際、リモートログストリーミングを設定することを推奨しています。

Compute では、ストリーミングログに複数のオプションがあります。 ログを始める最も簡単な方法は、Log Tailing 機能を使用することです。これにより、Compute アプリケーションからローカルコンソールにカスタムログメッセージをストリーミングすることができます。 Fastly のリアルタイムログストリーミング機能を設定して、ストレージと分析の目的でサードパーティサービスにログを自動的に保存することができます。これらのログオプションを個別にまたは同時に活用することができます。

注意

Fastly ではサードパーティのサービスに関する直接のサポートは行っておりません。詳細については、Fastly のご利用規約をご覧ください。

重要

ストリームログに含める予定のデータに対する設定とエンドポイントの決定を行う際には、セキュリティ、プライバシー、およびコンプライアンスのそれぞれの要件を必ず考慮するようにしてください。

ログのストリーミング方法

Fastly では、複数のログ収集サーバーを使用し、それぞれがログファイルを送信しますが、重複したエントリは含まれません。これらのログファイルは、ストリーミングが開始されるとすぐに作成され、指定した期間 (指定がない場合にはデフォルトの期間) ログが書き込まれます。その期間が経過すると、それらのファイルへの書き込みが終了し、ログプロセスによって新たにファイルが作成されます。

ログサーバーの集計ポイントの数は、容量要件に従って時間とともに変化する場合があります。ログをストレージエンドポイントに送信する場合に、ディスクで作成されるログファイルの数について懸念がある場合は、リアルタイム使用をサポートするログエンドポイントを選択することでログファイルの事前処理が不要になることを検討してください。

Log Tailing 機能によるログの設定

Compute@Edge を使用してログ機能を試す最も簡単な方法は、Log Tailing 機能を使用することです。Log Tailing 機能を使用して、ローカルコンソールに直接 stdoutstderr から出力を表示することができます。サードパーティサービスとの統合やエンドポイントは必要ありません。これは、コードのテストとデバッグに便利です。

Compute でのテストとデバッグに関するドキュメントでは、Compute スターターキットのいずれかを使用してサービスでライブテールを使用する方法についての手順を確認できます。

サードパーティのエンドポイント経由でのログの設定

Compute でログ機能を設定するもう1つの方法は、1つ以上のサードパーティーのログエンドポイントを設定することです。 リモートログストリーミングを設定する前に、以下の点に注意してください:

  • ログプロバイダ配信形式と、その配信内容を再確認してください。プロバイダーには、許可する形式に必要な厳格なフォーマット要件 (JSON など) があります。
  • サービスで複数のログエンドポイントを設定する場合、すべてのログエンドポイントにログが送信されます。

ログエンドポイントの設定にアクセスするには、次の手順に従ってください。

  1. Fastly コントロールパネルにログインします。
  2. Home ページから、適切なサービスを選択します。検索ボックスで ID、名称、ドメインによる検索が行えます。
  3. Edit configuration をクリックし、アクティブなバージョンをクローンするオプションを選択します。
  4. Logging をクリックします。すでにログエンドポイントを追加している場合は、Create Endpoint をクリックします。 利用可能なログエンドポイントのリストが表示されます。

    ログエンドポイントページ

  5. 該当するエンドポイントのログ取得ガイドの手順に従ってセットアッププロセスを完了し、変更内容をデプロイします。

Activate をクリックして変更をデプロイすると、ログはすぐに記録開始されます。ログがログサーバーで表示されるまで若干時間を要することがあります。

高度なログ設定

使用しているスターターキットによっては、ログデータのより正確なコントロールを可能にする高度な設定機能が存在する場合があります。たとえば、Rust の log_fastlyクレートには、サードパーティのログエンドポイントと Log Tailing 機能を統合し、異なるログレベルのデフォルトエンドポイントを定義し、複数のログエンドポイントをサポートするオプションがあります。JavaScriptGO を使って、高度な設定を行うことも可能です。

Rust を使用する例

以下の例は、ログデータを JSON としてフォーマットしてサードパーティのエンドポイントに送信する方法を示しています。ここでは、Rust 用のデフォルトのスターターキットが使用されています。

この例では、以下のような JSON オブジェクトを想定する my_endpoint というエンドポイント名が設定されています。

1{
2 "client_ip": "127.0.0.1",
3 "host": "firstly-coral-feather",
4 "request_method": "GET",
5 "timestamp": "2022-09-22 17:30:17.225185 UTC",
6 "trace_id": "cffc6f9a6b0645ad89adc569c99e91aa",
7 "url": "https://firstly-coral-feather/"
8}

JSON としてログデータをフォーマットするには、Cargo.toml ファイルに serde_json を依存関係として、タイムスタンプデータの Chrono と一緒に追加します。

1[dependencies]
2fastly = "0.8.7"
3log-fastly = "0.8.7"
4log = "0.4.17"
5chrono = "0.4"
6serde_json = "1.0.85"

次に、スターターキットの src/main.rs ファイルを変更します。

1//! Compute logging demo
2use fastly::http::{header, Method, StatusCode};
3use fastly::{mime, Error, Request, Response};
4use serde_json::json;
5#[fastly::main]
6fn main(req: Request) -> Result<Response, Error> {
7 // Filter request methods...
8 match req.get_method() {
9 // Allow GET and HEAD requests.
10 &Method::GET | &Method::HEAD => (),
11 // Deny anything else.
12 _ => {
13 return Ok(Response::from_status(StatusCode::METHOD_NOT_ALLOWED)
14 .with_header(header::ALLOW, "GET, HEAD")
15 .with_body_text_plain("This method is not allowed\n"))
16 }
17 };
18 // Pattern match on the path...
19 match req.get_path() {
20 // If request is to the `/` path...
21 "/" => {
22 // Initialize the logger with the one endpoint
23 // Notice we are echoing to stdout, so we don't need separate println! for log-tailing
24 log_fastly::Logger::builder()
25 .max_level(log::LevelFilter::Info)
26 .default_endpoint("my_endpoint")
27 .echo_stdout(true)
28 .init();
29 // Get some request data to log
30 let ts = chrono::Utc::now();
31 let record = json!({
32 "timestamp": ts.format("%F %T%.6f %Z").to_string(),
33 "trace_id": std::env::var("FASTLY_TRACE_ID").unwrap_or_else(|_| String::new()),
34 "client_ip": req.get_client_ip_addr().unwrap().to_string(),
35 "host": req.get_header_str("Host"),
36 "request_method": req.get_method_str(),
37 "url": req.get_url_str(),
38 });
39 // Send the logs
40 // note we didn't specify a target so it goes to `my_endpoint`, which we set as the default
41 // We could have also specified the target log::info!(target: "my_endpoint", "{}", record.to_string())
42 log::info!("{}", record.to_string());
43 // Send a default synthetic response.
44 Ok(Response::from_status(StatusCode::OK)
45 .with_content_type(mime::TEXT_HTML_UTF_8)
46 .with_body(include_str!("welcome-to-compute@edge.html")))
47 }
48 // Catch all other requests and return a 404.
49 _ => Ok(Response::from_status(StatusCode::NOT_FOUND)
50 .with_body_text_plain("The page you requested could not be found\n")),
51 }

準備ができたら、サービスをビルドおよびデプロイし、サービスに Log Tailing を設定して開発コンソールでログ出力を確認できるようにします。

一般的なログエラーのトラブルシューティング

ログエラーは、設定エラーとフォーマットエラーの2つの一般的なカテゴリに分類されます。

設定エラーには、誤ったバケット名や認証情報などが含まれます。設定エラーは、一般にコントロールパネルに表示されるエラーメッセージの詳細に表示されます。

ログ設定エラーの例

設定エラーを解決するには、バケット名と認証キーが正確でスペルが正しいことを確認してください。

フォーマットエラーには、無効な JSON、スキーマの不一致、またはベンダー固有のフィールドの欠落などが含まれます。リモートエンドポイントによっては、収集したデータに特定のフォーマットが使用されるため、これらによってエラーが発生します。

リモートエンドポイントにログメッセージが表示されず、Log Tailing の出力に表示される場合(Log Tailing を使用するようにログエンドポイントが設定されている場合)、ログメッセージで JSON のフォーマットを確認してください。JSON が有効で、プロバイダーが期待するフォーマットであることを確認してください。

ログの受信

Fastly コントロールパネルに表示されるエラーが現在アクティブになっているサービスバージョンのログ設定が壊れていることを示唆するものの、依然として部分的にログを受信している場合、エンドポイントのサーバーに接続できない Fastly のログ収集サーバーが存在している可能性があります。この場合、同時接続の最大数に達した可能性があります。ログエンドポイントサーバーの設定で、インバウンド接続の最大数を増やし、数時間後にエラーが解消されたかどうかを確認してください。


翻訳についての注意事項
このガイドは役に立ちましたか?

このフォームを使用して機密性の高い情報を送信しないでください。サポートが必要な場合は、サポートチームまでご連絡ください。このフォームは reCAPTCHA によって保護されており、Google のプライバシーポリシー利用規約が適用されます。