アプリ、ジョブ、関数のログの書き込みと表示

ロギングを行うと、IBM Cloud® Code Engine の問題のトラブルシューティングに役立ちます。 コンソールまたはCLIを使ってログを見ることができます。

フリート向けロギングにご興味がおありですか? フリートに対する観測可能性の設定 および フリートに対するログとモニタリングデータの 表示を参照してください。

ログを書く

ログのフォーマット、重大度レベル、タイムスタンプ、非構造化ログと構造化ログの両方における複数行エントリの処理のベストプラクティスを含む、 IBM Cloud® Code Engine で効果的にログを書く方法を学びます。

ログを書く際の注意点

標準出力とエラーへのログの書き込み

Code Engine では、ワークロードによって生成されたログレコードは、 stdout または stderr に書き込まれたときにのみ収集されます。これは、ログファイルを管理するのではなく、ログをイベントストリームとして扱うことを推奨する Twelve-Factor App ガイドラインに従ったものです。 クラウド・ネイティブ・アプリケーションの作成:12ファクターのアプリケーション - ファクター11 - ログ を参照。

プラットフォームのロギング・パイプラインは、この出力を自動的にキャプチャして処理し、分析やトラブルシューティングに利用できるようにする。 コンテナのエフェメラル・ファイル・システム内のファイルに書き込まれたログ行は、取り込まれず、永続化されず、ロギング・インターフェースを通じて公開されない。 その結果、エフェメラル・ファイル・システムに保存されたログは、インスタンスが再起動または終了すると失われ、運用のデバッグや根本原因の分析に利用できなくなる。

ログ行にタイムスタンプを加えるべきか?

ユーザーのワークロードによって生成されたログレコードは、 Code Engine インフラストラクチャが自動的にタイムスタンプを取得し、標準化するため、独自のタイムスタンプ情報を埋め込むことは避けるべきである。 アプリケーションレベルのタイムスタンプを含めると、特にシステムクロックがずれたり違ったりする可能性のある分散環境やコンテナ環境でワークロードが実行される場合、サービス間で不整合が生じる可能性がある。 プラットフォームのタイムスタンプに依存することで、統一された時間フォーマット、正確なシーケンス、および他のシステム生成ログとの信頼性の高い相関が保証され、展開全体にわたるトラブルシューティング、監査、および観測可能性が簡素化されます。

私のログレベルは、 IBM Cloud Logs の重要度にどのように対応しますか?

各ログレコードで提供されるログレベルは、「 ログの重大度を IBM Cloud Logs の重大度にマッピングする 」の説明に従って、 IBM Cloud Logs の重大度にマッピングされる。 以下のセクションでは、非構造化ログと構造化ログのログレベルがどのように解析され、どのログレベル値がサポートされるかについて詳しく説明します。

ログデータが複数行にわたる場合は?

IBM Cloud Logs の検索とフォーマット機能を利用するには、以下のようにログのフォーマットを変更してください。

  • ログの行が複数行にまたがる場合は、ログの書式と出力方法を変更して、1行に収まるようにしてください。 IBM Cloud Logs を使用して、ログにJSONLフォーマット(「 ログのフォーマット 」を参照)を使用します。
  • ログは IBM Cloud Logs の制限に 適合していなければならない。

ログ形式

ログデータは2つの一般的なフォーマットで出力される:非構造化と構造化。

  • 構造化されていないログは自由形式のテキストであり、生成するのは簡単で人間が読めるが、バックエンドシステムが一貫して解析するのは難しい。 このため、信頼性の高いフィルタリングと相関が制限される。
  • 構造化ログは、予測可能なスキーマ(たとえば、JSON)でフィールドをエンコードし、ログパイプラインがリクエストID、ユーザーID、またはドメイン固有のメタデータなどの属性をインデックス化し、クエリできるようにします。 Code Engine、構造化ログのJSONをサポートし、カスタムフィールドが機械可読性を維持し、観測可能なツール間で容易にフィルタリングできるようにします。

ログ行をカスタムでフィルタリング可能な情報で充実させるつもりなら、構造化ロギングを使用する。

非構造化ログ

以下は、構造化されていないログ行(自由形式のテキスト)を標準出力に書き出す簡単な例である。

サンプルは、 Code Engine パブリックサンプルリポジトリ https://github.com/IBM/CodeEngine/blob/main/logging/README.md に公開されています。

Node.js (JavaScript)

console.log('User signup succeeded for account abc123');

Python

print("User signup succeeded for account abc123")

Golang

package main

import (
    "fmt"
)

func main() {
    fmt.Println("User signup succeeded for account abc123")
}

Java

package com.ibm.cloud.codeengine.sample;

public class App {
    public static void main(String[] args) {
        System.out.println("User signup succeeded for account abc123");
    }
}

ログレベル検出

各ログ記録は、深刻度を決定するためにキーワードでスキャンされる。 深刻度の値は、大文字小文字を区別せずに評価され、 criticalerrorwarninfodebugverbose となる。

ログ行が LEVEL MESSAGE の形式で重大度キーワードで始まる場合、 Code Engine は、表示されたログメッセージから検出されたレベルを削除します。これにより、ユーザは、 IBM Cloud Logs ビューで重大度によって正確にフィルタリングしながらも、コアコンテンツに集中することができます。 この場合、抽出された重大度値はログレコードのフィールド level に格納されます。 以下の大文字小文字を区別しない重大度レベルがサポートされている: fatal error, warn, info, debug, および trace。 例えば、 Node.js :

// Unstructured log with level prefix
console.log('ERROR Payment service timeout while creating invoice');

IBM Cloud Logs では、この項目は深刻度 「Error 」で表示され、 「請求書作成中に決済サービスがタイムアウトしました」というメッセージが表示されます。 深刻度「Error 」でフィルタリングして結果を絞り込むことができます。 また、構文解析ルールと重大度ルールを使用して、レベルの抽出方法と照合方法を環境に合わせて調整することもできる。

ログ・レベルの検出は、ログ行が LEVEL: MESSAGE[LEVEL] MESSAGE のように微妙に異なる書式に従っている場合にも機能する。 しかし、このような場合、重要度が適切に分類されていても、ログメッセージからlevelキーワードは削除されない

さらに、検出ロジックは、サポートされるキーワードが冒頭だけでなく、 メッセージ内の任意の場所、重大度レベルを推測することができます。 例えば、ログライン:

The payment workflow encountered an unexpected error during validation

このログ行は、メッセージテキストにエラーという単語が表示されているため、 エラーに分類される。

ログレベル検出では、入力ストリーム(stdout または stderr )は考慮されません。 そのため、標準エラー(stderr)に書き込まれたログ・メッセージは、純粋にメッセージ・テキストだけで評価される。 例えば、 console.error("Some message") は標準エラーに書き込まれるが、 Infoに分類される。

ファンクションワークロードの場合、ログレベルが、 LEVEL MESSAGE の形式でログ行の先頭に検出されても、表示されたログメッセージから削除されることはない。

タイムスタンプの解析と評価

アプリケーションのログ行にタイムスタンプを追加することは推奨されません。なぜなら、ログが取り込まれるときに、 Code Engine、自動的に正規化されたタイムスタンプが割り当てられるからです。 ログ行の先頭にタイムスタンプが含まれている場合、システムはそのタイムスタンプの解析を試みる。 それがサポートされている書式の1つにマッチする場合、タイムスタンプは、ログレベルがどのように処理されるかに似て、表示されたログメッセージから取り除かれる。 サポートされているタイムスタンプ形式は以下の通り:

  • 2026-02-08T20:30:45.123
  • 2026-02-08T20:30:45.123Z
  • 2026-02-08T21:03:45.123456Z
  • 2026-02-08T21:03:45.123456789Z
  • 2026-02-08 21:03:45.123Z
  • 2026-02-08 20:30:45.123

ログ行の先頭にタイムスタンプとログレベルの両方が含まれる場合(例えば、 TIMESTAMP LEVEL MESSAGE )、パイプラインは両方のフィールドを評価する。 両方がサポートされているパターンにマッチする場合、それらはそれぞれ適切に分類され、レンダリングされたログメッセージから取り除かれ、読みやすくフィルタリングしやすいようにメッセージ本体だけが残される。 例えば、以下のフォーマットは正常にパースされる:

  • 2026-02-08T21:03:45.123456789Z ERROR Payment service timeout
  • 2026-02-08 20:30:45.123 INFO Starting billing workflow

タイムスタンプが表示されるが、サポートされているフォーマットと一致しない場合、そのタイムスタンプはログ行の一部として残り、通常のテキストとして扱われるが、メッセージの残りの部分は通常通り処理される。

関数ワークロードでは、タイムスタンプは解析、評価、ログメッセージからの削除は行われない。 関数のログに含まれるタイムスタンプは、表示されるメッセージの一部として残ります。

マルチライン・サポート

Code Engine は複数行のログエントリーをサポートする。 しかし、ログを出力する際には、改行文字 (\n) が 適切にエンコードされた (\\n) であることを確認しなければなりません。そうすれば、ロギングパイプラインは複数行のメッセージを正しく処理し、レンダリングすることができます。 例えば、 Node.js では、次のような複数行のログ・エントリーを作成できる:

console.log("Starting billing workflow...\\nStep 1: Validating input...\\nStep 2: Processing payment...");

エラーの記録

作業負荷が複数行のエラー・スタック・トレースを出力する場合、構造化されていないコンソール出力の代わりに、構造化されたJSONログ・フォーマットを使用する。 構造化 ログは 複数行のフィールドを確実に保持し、スタックトレースが1つのログレコードにグループ化されることを保証します。

例えば、以下のログメッセージは、キーワード "error" がログメッセージに現れるため、 エラーとして分類される。 しかし、 err オブジェクトによって提供されるスタック・トレースは、複数のログ行で表示される。

try {
  throw new Error("boom!");
} catch (err) {
  console.error("An error occurred", err);
}

構造化ログ

以下は、 level フィールドにログレベルをmessage フィールドにログメッセージを持つ単一のJSONを生成する、各言語とランタイムの最小構造化ログの例である。

サンプルは、 Code Engine パブリックサンプルリポジトリ https://github.com/IBM/CodeEngine/blob/main/logging/README.md に公開されています。

Node.js ( ウィンストン )

import winston from "winston";
const { combine, json } = winston.format;

// Create a custom logger
const logger = winston.createLogger({
  level: 'info',
  transports: [new winston.transports.Console()],
  format: combine(json())
});

// Usage
logger.info("User signup succeeded")
logger.error("Payment service timeout")

Python ( ログル )

from loguru import logger
import sys
import json
import traceback

# Define a custom JSON sink
def json_sink(message):
    record = message.record

    # Base fields: level + message, no timestamp
    payload = {
        "level": record["level"].name,   # e.g., "INFO"
        "message": record["message"],    # rendered message
    }

    # Merge in any bound extra fields as top-level keys
    # (skip reserved keys to avoid accidental overwrite)
    for k, v in record["extra"].items():
        if k not in ("level", "message", "stack"):
            payload[k] = v

    # If an exception is attached, render full stack trace into "stack"
    exc = record["exception"]
    if exc:
        # exc.type, exc.value, exc.traceback are available from Loguru
        stack_text = "".join(traceback.format_exception(exc.type, exc.value, exc.traceback))
        payload["stack"] = stack_text

    # Emit a single JSON line
    sys.stdout.write(json.dumps(payload, ensure_ascii=False) + "\n")
    sys.stdout.flush()


# Remove default handler (which includes timestamp, etc.) and add our custom sink
logger.remove()
logger.add(json_sink, level="DEBUG")  # lowest level you want to capture

# Usage
logger.info("User signup succeeded")
logger.error("Payment service timeout")

Golang ( スロッグ )

package main

import (
    "log/slog"
    "os"
)

func main() {
    handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
        // Remove time and rename msg->message
        ReplaceAttr: func(groups []string, attr slog.Attr) slog.Attr {
            // Drop the time attribute
            if attr.Key == slog.TimeKey {
                return slog.Attr{} // empty => removed
            }
            // Rename msg to message
            if attr.Key == slog.MessageKey {
                return slog.String("message", attr.Value.String())
            }
            return attr
        },
    })
    logger := slog.New(handler)

    // Usage
    logger.Info("User signup succeeded")
    logger.Error("Payment service timeout")
}

Java ( SLF4JLogback with logstash-logback-encoder )

src/main/resources/logback.xml:

<configuration>
    <appender name="jsonConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <timeZone>UTC</timeZone>
            <fieldNames>
                <timestamp>[ignore]</timestamp>
                <logger>[ignore]</logger>
                <version>[ignore]</version>
                <levelValue>[ignore]</levelValue>
                <threadName>[ignore]</threadName>
            </fieldNames>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="jsonConsoleAppender" />
    </root>
</configuration>

src/main/java/com/ibm/cloud/codeengine/sample/App.java:

package com.ibm.cloud.codeengine.sample;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class App {
  private static final Logger logger = LoggerFactory.getLogger(App.class);

  public static void main(String[] args) {
    logger.info("User signup succeeded");
    logger.error("Payment service timeout");
  }
}

ログレベル検出

各ログ記録は、深刻度を決定するためにキーワードでスキャンされる。 深刻度の値は、大文字小文字を区別せずに評価され、 criticalerrorwarninfodebugverbose となる。

構造化ログを使用する場合、 Code Engine は、ログレベルが以下のフィールドのいずれかで提供されると、自動的にそれを検出します: level severity または logLevel。 これらのフィールドの値は、大文字小文字を区別しない。つまり、 errorERRORError のようなエントリーは、すべて同じ重大度にマッピングされる。 以下の大文字小文字を区別しない重大度レベルがサポートされている: critical error, warn, info, debug, および verbose。 サポートされているフィールドが存在し、これらの値の1つが含まれている場合、ログレベルが抽出され、正規化され、ログUI内のフィルタリングおよび分類に使用されます。 例えば、以下の構造化されたログ行は、すべてレベル Errorで適切に解釈される:

{ "level": "error", "message": "Payment service timeout" }
{ "severity": "ERROR", "message": "Failed to connect to database" }
{ "logLevel": "eRrOr", "message": "Workflow aborted" }

大文字小文字や使用されている特定のフィールド値に関係なく、プラットフォームはログレベルを正しく識別し、構造化ログデータ全体のフィルタリング、グループ化、分析のためにそれを適用します。

タイムスタンプ評価

構造化ログの場合、 カスタムタイムスタンプは解析も評価もされない。 あなたが提供したタイムスタンプフィールドは、純粋にペイロードデータとして扱われ、プラットフォームは、順序付けとフィルタリングのために、常に独自のインジェストタイムスタンプを適用します。

以下の例では、"timestamp"の値は保存されるが、ログのタイミングでは無視される

{ "level": "INFO", "message": "Processing started", "timestamp": "2026-02-08T20:30:45.123Z" }

コンテキスト情報の追加

構造化ログをカスタムフィールド(例えば、 requestIduserId、またはドメイン固有のメタデータ)で充実させることができる。 以下は、先に使用した各スタックの最小限の例である。

カスタムフィールドを簡潔で安定したもの(例えば、ID、コード、または小さな列挙型)に保ち、ロギングインスタンスのフィルタリング可能性を最大化し、カーディナリティを最小化します。

Node.js ( ウィンストン )

logger.debug("A structured log entry that contains an extra key", {
  extra_key: "extra_value",
});

Python ( ログル )

logger.bind(extra_key="extra_value").debug("A structured log entry that contains an extra key")

Golang ( スロッグ )

logger.Debug("A structured log entry that contains an extra key",
  slog.String("extra_key", "extra_value"),
)

Java ( SLF4JLogback with logstash-logback-encoder )

logger.atDebug().addKeyValue("extra_key", "extra_value")
                .log("A structured log entry that contains an extra key");

エラーの記録

エラーメッセージとそのスタックトレースの 両方を構造化ログに取り込むには、標準フィールド(levelmessage )と stack (または同様の)フィールドを含むJSONレコードを発行する。

Node.js ( ウィンストン )

// Error logging
try {
  throw new Error("boom!");
} catch (err) {
  // The error stack trace is rendered in a single log message (see field stack)
  logger.error("An error occurred", err);
}

Python ( ログル )

try:
  raise RuntimeError("boom!")
except Exception:
  # logger.exception() automatically attaches the current exception info
  logger.exception("An error occurred")

Golang ( スロッグ )

err := errors.New("boom!")
logger.Error("An error occurred",
    slog.Any("err", err),
    // The error stack trace is rendered in a single log message (see field stack)
    slog.String("stack", string(debug.Stack())),
)

Java ( SLF4JLogback with logstash-logback-encoder )

try {
    throw new RuntimeException("boom!");
} catch (Exception e) {
    logger.atError()
            .setCause(e) // The error stack trace is rendered in a single log message (see field stack_trace)
            .log("An error occurred");
}

関数ワークロードは複数行のログを扱うが、各改行文字は別々のログエントリーになる。 構造化されたロギングフレームワークでスタックトレースをロギングする場合、改行文字を手動でエスケープして、1つのログエントリとして正しく表示されるようにする必要があるかもしれません。

ロギング・フィールド

Code Engine ロギングフィールド。
フィールド名 説明 値の例
app IBM Cloud、プラットフォーム・ログ・ラインを発したサービス。 Code Engine の場合、これは常に codeengine となる。 codeengine
tag fluentbitが設定するフィールドで、fluentbitのconfigで設定された入力IDから派生する。 platform.<id>.codeengine
stream ログレコードを受け取った出力ストリーム。 設定可能な値: stdout または stderr
originator Code Engine システムコンポーネントまたはユーザーワークロードがログ行を発行したかどうかを示す。 systemまたはuser
resourceGroupId Code Engine プロジェクトのリソースグループCRN。 <resource group CRN>
messageKey オプションで、ログのフィルタリングやトラブルシューティングのための、人間が読める一意の識別子。 ユーザー定義文字列
codeengine.region Code Engine プロジェクトの地域。 us-south
codeengine.project Code Engine プロジェクト名。 ユーザー定義文字列
codeengine.projectGuid Code Engine プロジェクトのGUID。 <project GUID>
codeengine.projectSubdomain Code Engine プロジェクトの名前空間。 edf5a781
codeengine.componentType ログラインを発したコンポーネントタイプ。 可能な値 app job, job_run, fleet, function, build, build_runcontainer
codeengine.component ログを出力したコンポーネント名。 ユーザー定義文字列
codeengine.subcomponentType ログラインを発したサブコンポーネントのタイプ。 可能な値 app_revision job_run, fleet_instance, function, build_runcontainer
codeengine.subcomponent ログ行を出力したサブコンポーネント名。 ユーザー定義文字列
codeengine.instanceId Pod名(アプリ、ジョブ、ビルドの場合)またはコンテナ・インスタンスID(ファンクションおよびフリートの場合)。 my-app-0001-pod-abcde
label.Namespace 非推奨。 Code Engine プロジェクトのサブドメイン名。 代わりに codeengine.projectSubdomain。 この項目は2026年6月15日以降削除される。 edf5a781
label.Project 非推奨。 Code Engine プロジェクトの名前。 代わりに codeengine.project。 この項目は2026年6月15日以降削除される。 ユーザー定義文字列
label.Stream 非推奨。 ログレコードを受け取った出力ストリーム。 代わりに stream。 この項目は2026年6月15日以降削除される。 設定可能な値: stdout または stderr
level オプション。 ログメッセージの重要度を定義します。 この値は、構造化されていないログメッセージからログレベルが抽出できた場合にのみ設定される。 値は大文字と小文字を区別しない。 可能な値 fatal error, warn, info, debugtrace
logtag 非推奨。 オプション。 受信したログ行が部分ログ行か完全ログ行かを示す。 このフィールドは、機能ワークロードには設定されない。 このフィールドは2026年6月15日以降に削除され、代替はない。 設定可能な値: F または P
message.message 人間が読めるログメッセージ。 システムコンポーネントまたはユーザーによって定義された文字列
message.logSourceCRN Code Engine プロジェクトのCRN。 <code engine project CRN>
message.saveServiceCopy 非推奨。 プラットフォームのログ行を IBM Cloud® Code Engine のシステムログにもコピーするかどうかを定義します。 このフィールドは2026年6月15日以降に削除され、代替はない。 false
message.serviceName 非推奨。 そのログ行を発した IBM Cloud サービスの名前。 代わりに app。 この項目は2026年6月15日以降削除される。 codeengine
message._app 非推奨。 インスタンス名(アプリ、ジョブ、ビルドの場合)またはコンポーネント名(関数の場合)。 代わりに、 codeengine.instanceIdcodeengine.component、またはその両方を使用してください。 この項目は2026年6月15日以降削除される。 my-app-0001-pod-abcde
message.* オプション。 ユーザーがダッシュボードやアラートを作成するのに便利なメタ情報。 durationSeconds

コンソールでのログの表示

ロギングを有効にしたコンソールで Code Engine アプリ、ジョブ、関数、またはビルドを操作すると、ログは IBM Cloud Logs サービスに転送され、インデックスが作成されます。

プラットフォームログを受け取る IBM Cloud Logs インスタンスは、 Code Engine プロジェクトと同じリージョンにある必要はありません。また、 Code Engine コンポーネントで作業する前に、このインスタンスを作成する必要はありません。 Code Engine アプリ、ジョブ、関数、またはコンソールのビルドページから、いつでもロギング機能を追加できます。

どのプラットフォームサービスでもログを生成するには、 アカウントごとに、地域ごとに1回だけログを有効にする必要があります。

コンソールからログを見る際の注意点

コンソールからロギングを使用したい場合、まず IBM Cloud Logs Routing を 使用して Code Engine ロギングデータを受信するように IBM Cloud Logs プラットフォームログを設定する必要があります。 アクティブな IBM Cloud Logs インスタンスを確認するには、 Observability ダッシュボードを参照してください。

保管、検索、ログ分析のニーズを検討する際には、 IBM Cloud Logs サービスプラン 情報を確認してください。

Code Engine アプリケーション、ジョブの実行、またはビルドの実行のログデータを表示する場合、データが IBM Cloud Logs で利用可能になるまでに遅延が発生することがあります。 例えば、ログデータが IBM Cloud Logs に表示されるまで、特に Store and search データパイプラインを使用している場合は、5分から10分程度かかることがあります。

IBM Cloud Logs インスタンスのログのレイテンシーとコストのバランスをとるためのオプションについては、 Data Pipelines のドキュメントを参照してください。

CLI でロギングを使用する場合、 Code Engine CLI ロギングは異なる方法でデータを取得するため、 IBM Cloud Logs プラットフォームログを設定する必要はありません。

CLIを通じて提供されるロギング機能は限定的であり、開発目的でのみ考慮されるべきである。 本番ワークロードを実行する場合は、常に IBM Cloud Logs インスタンスを使用してください。 は、ログの保持、フィルタリング、検索機能を提供します。

IBM Cloud Logs データにフィルタを適用できますか?

IBM Cloud Logs ページから、特定のアプリケーションリビジョン、ジョブの実行、またはビルドの実行に対して、特定のレベル、またはより詳細なレベルでログデータを表示するために、必要に応じてフィルタを変更し、スコープを設定することができます。

  • app:"codeengine" が設定されている場合、 Code Engine のログのみが表示される。

  • codeengine.project:'<project_name>' が設定されている場合、特定のプロジェクトのログのみが表示されます。

  • codeengine.component:'<your_component_name>' が設定されている場合、指定されたコンポーネント(アプリケーション、ジョブ、ビルド)からのログのみが表示されます。 Code Engine コンポーネントが同じ名前を共有している場合、フィルターにはこれらのコンポーネントからのログが含まれます。 以下に例を示します。

    • フィルター app:"codeengine" AND codeengine.component:"myapp" は、ログを myapp アプリケーションレベルにスコープする。
    • フィルター app:"codeengine" AND codeengine.subcomponent:"myapp\-00002" は、ログを myapp-0002 アプリケーションリビジョンレベルにスコープします。
    • フィルター app:"codeengine" AND codeengine.component:"myjob" は、ログを特定の myjob ジョブレベルにスコープする。
    • フィルター app:"codeengine" AND codeengine.subcomponent:"myjob\-jobrun\-t6m7l" は、ログを特定の myjob-jobrun-t6m7l ジョブ実行レベルにスコープする。
    • フィルター app:"codeengine" AND codeengine.component:"mybuild" は、ログを特定の mybuild ビルド・レベルにスコープする。
    • フィルター app:"codeengine" AND codeengine.subcomponent:"mybuild\-run\-121212" は、ログを特定の mybuild-run-121212 ビルド実行レベルにスコープする。

コンソールでのロギングの設定と開始の詳細については、 コンソールからアプリ、ジョブ、または関数のログを表示するを 参照してください。

コンソールからアプリ、ジョブ、または関数のログを表示する

アプリ、ジョブ、機能のログを見ることができます。 コンソールからこれらのいずれかを表示する手順は非常によく似ている。

作業したいプロジェクトを選択した後、 Code Engine 概要ページ、またはアプリケーションジョブ機能ページのような子ページの1つから、あるいはアプリケーション、ジョブ、機能に特化したページから、ロギング機能を追加することができます。 以下の手順は、特定の Code Engine ページから作業していると仮定しています。

  1. あなたが作成し、デプロイしたアプリ、ジョブ、または機能にアクセスしてください。 Code Engine コンソールの Projects ページからプロジェクトを選択し、 ApplicationsJobsFunctions のいずれかを選択します。 作業したいアプリ、ジョブ、機能を選択します。
  2. 以前に IBM Cloud Logs インスタンスを作成した場合は、[ Logging]をクリックして、 IBM Cloud Logs サービスを開きます。
  3. ロギング機能を追加して設定するには、以下の手順を実行します:
    1. Test applicationSubmit job、または Test function のオプションメニューから、 Add logging をクリックして、 IBM Cloud Logs インスタンスを作成します。 この操作によって、IBM Cloud Logs サービスが開きます。
    2. IBM Cloud Logs サービスから、ロギング・インスタンスを作成します。 ロギング・インスタンスが作成されたことを確認するために、「プログラム識別情報」ダッシュボードを参照してください。
    3. Code Engine アプリ、ジョブ、またはファンクションページから、 Test application(アプリケー ションのテスト )、 Submit job(ジョブの送信 )、または Test function(ファンクションのテスト) オプ ションメニューの Add logging(ロギングの追加 )をクリックします。 今回は、プラットフォーム・ログを受信する IBM Cloud Logs インスタンスを選択する。 前のステップで作成したロギング・インスタンスを選択します。 選択 をクリックする。 Code Engine は、 Code Engine ロギングデータを受信するために有効なプラットフォームログを必要とする。 この操作を完了すると、 Code Engine、プラットフォーム・ロギングが有効になります。
  4. プラットフォームログの設定が完了したら、 Code Engine アプリ、ジョブ、またはファンクションページから、 Test applicationSubmit job、または Test function のオプションメニューから Logging をクリックし、プラットフォームログウィンドウを開きます。 プラットフォーム・ログがリージョンに対して設定されていることを確認するには、 「プログラム識別情報」ダッシュボードを確認します。
  5. (オプション) 必要に応じて、 検索のフィルタを 絞り込みます。
  6. 以下のステップのいずれかを実行して、設定を確認する:
    • アプリケーションまたは関数をテストする場合は、必要に応じて[ Test application ]または[ Test function]をクリックし、[ Send request ]をクリックします。 アプリケーションまたは機能をウェブページで開くには、 アプリケーション URL または機能 URL をクリックします。 プラットフォームログウィンドウで、テストのプラットフォームログを見ることができます。
    • ジョブの実行: ジョブの実行エリアから、 Submit jobをクリックしてジョブを実行します。 ジョブ実行の構成値を指定します。デフォルト値を受け入れることもできます。 **「ジョブの実行依頼」**をクリックしてジョブを実行します。 ジョブ実行時のプラットフォームログは、プラットフォームログウィンドウで見ることができます。

Code Engine アプリ、ジョブ、または関数のプラットフォームロギングを受け取ることができるように、 IBM Cloud Logs インスタンスが設定されました。

または、 Observabilityダッシュボードを 使用してインスタンスを作成し、 プラットフォームログのルーティングを構成する ことによって、 IBM Cloud Logs インスタンスを構成することもできます。

コンソールでのビルド・ログの表示

コンソールで、特定のビルド実行インスタンスのログを表示できます。

  1. Code Engine ダッシュボードに移動します。
  2. プロジェクトを選択するか、作成する。
  3. 「プロジェクト」ページで、**「イメージ・ビルド (Image builds)」**をクリックします。
  4. イメージビルドタブで、イメージビルドの名前をクリックして、定義されたビルドのビルドページを開くか、ビルドを作成します。
  5. 定義済みビルドのビルド・ページの**「ビルド実行 (Build runs)」セクションで、該当するビルド実行のインスタンスの名前をクリックします。 ビルド実行を作成するには、「ビルドの実行依頼 (Submit build)」**をクリックする必要がある場合があります。 ビルド実行時のプラットフォームログは、プラットフォームログウィンドウで見ることができます。 また、ビルド実行インスタンスページから、ビルドステップ詳細のビルドログ情報を見ることもできる。 特定のビルド・ステップ・ログ・データのためにビルド・ステップを展開する。 必要に応じて、 検索フィルタを 絞り込むこともできます。

CLI でのログの表示

CLIでロギング出力を表示するには、アプリやジョブのインスタンスが実行されている必要があります。 アプリがゼロにスケールされた場合、またはジョブ実行インスタンスが完了した場合、出力は ibmcloud ce app logs および ibmcloud ce jobrun logs コマンドの出力はログデータを持ちません。 あるいは、 IBM Cloud Logs サービスを使ってログデータを見ることもできる。

CLI でのアプリケーション・ログの表示

CLI で特定のアプリのアプリ・ログを表示するには、application logs コマンドを使用します。 アプリのすべてのインスタンスのログを表示したり、アプリの特定のインスタンスのログを表示したりできます。 app get コマンドを使用すると、アプリに関する詳細 (アプリの実行中インスタンスを含む) が表示されます。

  • myapp アプリの全インスタンスのログを表示するには、 --app オプションでアプリ名を指定する。 以下に例を示します。

    ibmcloud ce app logs --app myapp
    

    出力例

    Getting logs for all instances of application 'myapp'...
    OK
    
    myapp-ii18y-2-deployment-7657c5f4f9-dgk5f:
    Server running at http://0.0.0.0:8080/
    
  • アプリの特定のインスタンスのログを表示するには、 --instance オプションでアプリの特定のインスタンス名を指定する。 以下に例を示します。

    ibmcloud ce app logs --instance myapp-ii18y-2-deployment-7657c5f4f9-dgk5f
    

    出力例

    Getting logs for application instance 'myapp-a5yp2-2-deployment-65766594d4-hj6c5'...
    OK
    
    myapp-a5yp2-2-deployment-65766594d4-hj6c5:
    Server running at http://0.0.0.0:8080/
    

CLI でのジョブのログの表示

CLI で特定のジョブ実行についてのログを表示するには、jobrun logs コマンドを使用します。 ジョブ実行のすべてのインスタンスのログを表示したり、ジョブ実行の特定のインスタンスのログを表示したりできます。 jobrun get コマンドを使用すると、ジョブ実行に関する詳細情報 (ジョブ実行インスタンスを含む) が表示されます。

  • testjobrun ジョブ実行のすべてのインスタンスのログを表示するには、 --jobrun オプションでジョブの実行名を指定します。 以下に例を示します。

    ibmcloud ce jobrun logs --jobrun testjobrun
    

    出力例

    Getting jobrun 'testjobrun'...
    Getting instances of jobrun 'testjobrun'...
    Getting logs for all instances of job run 'testjobrun'...
    OK
    
    testjobrun-1-0:
    Hello World!
    
    testjobrun-2-0:
    Hello World!
    
    testjobrun-3-0:
    Hello World!
    
    testjobrun-4-0:
    Hello World!
    
    testjobrun-5-0:
    Hello World!
    
  • testjobrun-1-0 ジョブ実行インスタンスのログを表示するには、ジョブ実行の特定のインスタンス名を --instance オプションで指定します。 以下に例を示します。

    ibmcloud ce jobrun logs --instance testjobrun-1-0
    

    出力例

    Getting logs for job run instance 'testjobrun-1-0'...
    OK
    
    testjobrun-1-0:
    Hello World!
    

CLI でのビルド・ログの表示

CLI で特定のビルド実行のビルド・ログを表示するには、buildrun logs コマンドを使用します。 ビルド実行の名前に基づいて、ビルド実行のすべてのインスタンスのログを表示できます。

mybuildrun ビルド実行のすべてのインスタンスのログを表示するには、 --name オプションでビルド実行の名前を指定する。 以下に例を示します。

ibmcloud ce buildrun logs --name mybuildrun

出力例

Getting build run 'mybuildrun'...
Getting instances of build run 'mybuildrun'...
Getting logs for build run 'mybuildrun'...
OK

mybuildrun-zg5rj-pod-z5gzb/step-git-source-source-r9fcf:
{"level":"info","ts":1614363665.8331757,"caller":"git/git.go:169","msg":"Successfully cloned https://github.com/IBM/CodeEngine @ 8b514ce871e50d67cfea3e344b90cade4bd26e90 (grafted, HEAD, origin/main) in path /workspace/source"}
{"level":"info","ts":1614363666.82988,"caller":"git/git.go:207","msg":"Successfully initialized and updated submodules in path /workspace/source"}

mybuildrun-zg5rj-pod-z5gzb/step-build-and-push:
INFO[0002] Retrieving image manifest node:12-alpine
INFO[0002] Retrieving image node:12-alpine
INFO[0003] Retrieving image manifest node:12-alpine
INFO[0003] Retrieving image node:12-alpine
INFO[0003] Built cross stage deps: map[]
INFO[0003] Retrieving image manifest node:12-alpine
INFO[0003] Retrieving image node:12-alpine
INFO[0004] Retrieving image manifest node:12-alpine
INFO[0004] Retrieving image node:12-alpine
INFO[0004] Executing 0 build triggers
INFO[0004] Unpacking rootfs as cmd RUN npm install requires it.
INFO[0008] RUN npm install
INFO[0008] Taking snapshot of full filesystem...
INFO[0010] cmd: /bin/sh
INFO[0010] args: [-c npm install]
INFO[0010] Running: [/bin/sh -c npm install]
npm WARN saveError ENOENT: no such file or directory, open '/package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open '/package.json'
npm WARN !invalid#2 No description
npm WARN !invalid#2 No repository field.
npm WARN !invalid#2 No README data
npm WARN !invalid#2 No license field.

up to date in 0.267s
found 0 vulnerabilities

INFO[0011] Taking snapshot of full filesystem...
INFO[0011] COPY server.js .
INFO[0011] Taking snapshot of files...
INFO[0011] EXPOSE 8080
INFO[0011] cmd: EXPOSE
INFO[0011] Adding exposed port: 8080/tcp
INFO[0011] CMD [ "node", "server.js" ]

mybuildrun-zg5rj-pod-z5gzb/step-image-digest-exporter-ngl6j:
2021/02/26 18:21:02 warning: unsuccessful cred copy: ".docker" from "/tekton/creds" to "/tekton/home": unable to open destination: open /tekton/home/.docker/config.json: permission denied
{"severity":"INFO","timestamp":"2021-02-26T18:21:26.372494581Z","caller":"logging/config.go:116","message":"Successfully created the logger."}
{"severity":"INFO","timestamp":"2021-02-26T18:21:26.372621756Z","caller":"logging/config.go:117","message":"Logging level set to: info"}