為應用程式、工作和功能撰寫和檢視日誌

記錄可以幫助您在 IBM Cloud® Code Engine 中排除故障。 您可以使用主控台或 CLI 檢視日誌。

對車隊記錄有興趣嗎? 請參閱 設定車隊的可觀察性,以及 檢視車隊的記錄和監控資料

寫作日誌

學習如何在 IBM Cloud® Code Engine 中有效地撰寫日誌,包括日誌格式、嚴重性層級、時間戳記的最佳實務,以及處理非結構化及結構化日誌的多行項目。

撰寫日誌的注意事項

將日誌寫入標準輸出和錯誤

在 Code Engine 中,工作負載產生的日誌記錄只有在寫入 stdoutstderr 時才會被收集,並遵循 Twelve-Factor App 指南,該指南建議將日誌視為事件流,而不是管理日誌檔案。 請參閱 建立雲端原生應用程式:12 因子應用程式 - 因子 11 - 日誌

平台的日誌管道會自動擷取和處理這些輸出,使其可用於分析和故障排除。 寫入容器暫存檔案系統中檔案的日誌行不會被擷取、持久化或透過日誌介面揭露。 因此,當重新啟動或終止實體時,儲存在短暫檔案系統上的任何日誌都會遺失,無法用於作業除錯或根本原因分析。

我是否應該在日誌行中加入時間戳記?

使用者工作負載產生的日誌記錄應避免嵌入自己的時間戳資訊,因為 Code Engine 基礎結構會自動擷取時間戳並將其標準化。 包含應用程式層級的時間戳記可能會造成服務間的不一致,尤其是工作負載在分散式或容器化環境中執行時,系統時鐘可能會偏移或不同。 依賴平台的時間戳記,可確保統一的時間格式、精確的順序,以及與其他系統產生的日誌之間的可靠關聯,從而簡化整個部署的故障排除、稽核和可觀察性。

我的日誌層級如何對應 IBM Cloud Logs 嚴重性?

每個日誌記錄中提供的日誌層級會對應到 IBM Cloud Logs 嚴重性,如將日誌 嚴重性對應到 IBM Cloud Logs 嚴重性 所述。 在接下來的章節中,您將進一步瞭解如何解析非結構化和結構化日誌的日誌層級,以及支援哪些日誌層級值。

如果我的日誌資料是多行資料,該怎麼辦?

若要利用 IBM Cloud Logs 搜尋和格式化功能,請變更您的記錄格式如下。

  • 如果您的日誌行跨越多行,請變更您格式化和輸出日誌的方式,使它們在單一行中。 使用 JSONL 格式(請參閱日誌 格式 )來處理您的日誌,IBM Cloud Logs。
  • 您的日誌必須符合 IBM Cloud Logs 的限制

日誌格式

日誌資料可以兩種常見格式釋出:非結構化和結構化。

  • 非結構化日誌是自由格式的文字,製作簡單且人類可讀,但後端系統很難持續解析。 這限制了可靠的篩選和相關性。
  • 結構化日誌將欄位編碼為可預測的模式 (例如 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");
    }
}

日誌層級偵測

每條記錄都會掃描關鍵字,以判斷嚴重性。 嚴重度值是以個案不敏感的方式來評估的,它們是 critical, error, warn, info, debug,和 verbose

如果日誌行以 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 和訊息文字 "Payment service timeout while creating invoice ";然後您可以依嚴重程度 = Error 篩選,以縮窄結果範圍。 您也可以使用解析和嚴重性規則,為您的環境量身訂做萃取和匹配層級的方式。

當日誌行遵循略有不同的格式時,日誌層級偵測也能運作,例如 LEVEL: MESSAGE[LEVEL] MESSAGE。 然而,在這些情況下,level 關鍵字不會從記錄訊息中移除,儘管嚴重性仍被正確分類。

此外,偵測邏輯可以在任何支援的關鍵字出現時推斷嚴重等級 訊息中的任何位置,而不只是在開頭。 例如,日誌行:

The payment workflow encountered an unexpected error during validation

此日誌行歸類為 錯誤,因為訊息文字中出現 錯誤 一詞。

日誌層級偵測不考慮輸入串流 (stdoutstderr) 來偵測日誌層級。 因此,寫入標準錯誤 (stderr) 的日誌訊息會純粹根據訊息文字來評估。 例如,console.error("Some message") 歸類為 Info,儘管它會寫入 stderr。

對於函式工作負載,即使在日誌行開頭偵測到日誌層級,也不會從顯示的日誌訊息中移除,格式為 LEVEL MESSAGE

時間戳解析與評估

不建議在應用程式日誌行中加入時間戳記,因為 Code Engine 會在擷取日誌時自動指定標準化時間戳記。 如果日誌行的開頭包含時間戳記,系統會嘗試解析它。 如果符合其中一種支援的格式,則會從顯示的日誌訊息中移除時間戳記,這與處理日誌層級的方式類似。 支援的時間戳格式包括

  • 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 日誌格式,而非非結構化的主控台輸出。 結構化日誌可靠地保留多行欄位,並確保堆疊追蹤歸類為單一日誌記錄,這將在 結構化日誌 一節中說明。

例如,下列日誌訊息被歸類為 Error,因為關鍵字 "error" 出現在日誌訊息中。 然而,由 err 物件提供的堆疊追蹤會以多行日誌呈現。

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

結構化日誌

範例

以下是每種語言和運行時間的 最小結構化記錄範例,這些語言和運行時間會發出單一 JSON,level 欄位中有日誌 級別message 欄位中有日誌 消息

這些範例已發佈在 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 ( slog )

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 與 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");
  }
}

日誌層級偵測

每條記錄都會掃描關鍵字,以判斷嚴重性。 嚴重度值是以個案不敏感的方式來評估的,它們是 critical, error, warn, info, debug,和 verbose

當您使用結構化日誌時,Code Engine 會自動偵測在下列欄位中提供的日誌層級:level, severity,或 logLevel。 這些欄位中的值不區分大小寫,這表示 error, ERROR,或 Error 等項目都對應到相同的嚴重性。 支援下列不區分大小寫的嚴重性等級:critical, error, warn, info, debug,和 verbose。 當支援的欄位存在並包含這些值之一時,會擷取記錄層級,將其規範化,並用於記錄使用者介面中的篩選和分類。 例如,以下結構化的日誌行都是以等級 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" }

新增額外的上下文資訊

您可以使用自訂欄位 (例如 requestId, userId, 或特定網域的 metadata) 來豐富結構化日誌。 以下是之前使用的每個堆疊的最小範例。

保持自訂欄位簡潔且穩定(例如 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 ( slog )

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

Java ( SLF4JLogback 與 logstash-logback-encoder )

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

記錄錯誤

若要在結構化日誌中擷取 兩者 錯誤訊息及其 堆疊追蹤,請發出包含標準欄位 (level, message) 加上 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 ( slog )

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 與 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");
}

函式工作負載會處理多行日誌,但每個換行符都會導致單獨的日誌項目。 當使用結構化記錄框架記錄堆疊追蹤時,您可能需要手動轉換換行符號,以確保它們能正確地呈現為單一記錄項目。

記錄欄位

Code Engine 記錄欄位。
欄位名稱 說明 範例值
app 發出平台日誌行的 IBM Cloud 服務。 對於 Code Engine,這永遠是 codeengine codeengine
tag 欄位由 fluentbit 設定,並從 fluentbit 配置中設定的輸入 ID 派生。 platform.<id>.codeengine
stream 接收記錄的輸出串流。 可能的值:stdoutstderr
originator 表示 Code Engine 系統元件或使用者工作負載是否發出該日誌行。 systemuser
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 日之後移除。 可能的值:stdoutstderr
level 選用。 定義日誌訊息的嚴重性。 只有當日誌層級可從非結構化的日誌訊息中抽取時,才會設定此值。 數值不區分大小寫。 可能的值:fatal, error, warn, info, debugtrace
logtag 已淘汰。 選用。 表示收到的記錄行是部分記錄行還是完整記錄行。 功能工作負載不設定此欄位。 此欄位在 2026 年 6 月 15 日後將被移除,且無替代品。 可能的值:FP
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.instanceId, codeengine.component,或同時使用兩者。 此欄位於 2026 年 6 月 15 日之後移除。 my-app-0001-pod-abcde
message.* 選用。 對使用者建立儀表板或警示有用的 Meta 資訊。 durationSeconds

從主控台檢視日誌

當您在主控台中使用 Code Engine 應用程式、工作、函式或建置並啟用日誌功能時,日誌會被轉發到 IBM Cloud Logs 服務,並在那裡建立索引,讓您可以全文搜尋所有已產生的訊息,並方便地根據特定欄位進行查詢。

接收平台日誌的 IBM Cloud Logs 範例不必與您的 Code Engine 專案位於同一區域,您也不需要在使用 Code Engine 元件之前建立此範例。 您可以隨時從主控台中的 Code Engine 應用程式、工作、功能或建立頁面新增記錄功能。

若要為任何平台服務產生記錄,您只需在每個區域、每個帳戶啟用一次記錄。

從主控台檢視日誌的注意事項

當您想要使用主控台的日誌記錄時,您必須先設定 IBM Cloud Logs 平台日誌,才能使用 IBM Cloud 日誌路由 接收 Code Engine 日誌資料。 若要檢查活動中的 IBM Cloud Logs 實例,請參閱 Observability 面板

在考慮保留、搜尋和日誌分析需求時,請檢閱 IBM Cloud Logs 服務計劃 資訊。

當您檢視 Code Engine 應用程式、作業的執行或建立的執行的日誌資料時,在 IBM Cloud Logs 中提供資料之前可能會發生延遲。 例如,您的日誌資料可能需要大約 5 到 10 分鐘才能顯示在 IBM Cloud Logs 中,尤其是當您使用 Store and search 資料管道時。

檢閱 資料管道 的說明文件,瞭解平衡 IBM Cloud Logs 實體的日誌延遲和成本的選項。

使用 CLI 記錄時,不需要設定 IBM Cloud Logs 平台記錄,因為 Code Engine CLI 記錄取得資料的方式不同。

透過 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 總覽頁面或其子頁面之一(例如應用程式工作功能頁面),或從特定於應用程式、工作或功能的頁面,新增記錄功能。 以下步驟假設您是從特定的 Code Engine 頁面進行工作。

  1. 前往您已建立並部署的應用程式、工作或功能。 從 Code Engine 主控台上的專案頁面,選擇您的專案,然後視情況選擇應用程式工作功能。 選取您要使用的應用程式、工作或功能。
  2. 如果您之前建立了 IBM Cloud Logs 範例,請按一下記錄,開啟 IBM Cloud Logs 服務。
  3. 若要新增和設定記錄功能,請完成下列步驟:
    1. 測試應用提交工作測試功能 選項功能表,按一下 新增記錄 以建立 IBM Cloud Logs 範例。 此動作會開啟 IBM Cloud Logs 服務。
    2. 從 IBM Cloud Logs 服務,建立您的記錄實例。 若要確認您的記錄實例已建立,請檢查 Observability 面板
    3. 從 Code Engine 應用程式、工作或功能頁,按一下 測試應用提交工作測試功能 選項功能表中的 新增記錄。 這次,請選擇 IBM Cloud Logs 範例來接收平台日誌。 選擇您在前一步中建立的記錄實例。 按一下「選取」。Code Engine 需要啟用平台日誌才能接收 Code Engine 日誌資料。 完成此動作時,Code Engine 會為您啟用平台記錄。
  4. 現在平台日誌已設定完成,從 Code Engine 應用程式、工作或功能頁面,按一下 測試應用提交工作測試功能 選項功能表中的 記錄,即可開啟平台日誌視窗。 若要確認您的區域已設定平台日誌,請檢查 Observability 面板
  5. (選用) 如有需要,請細化 搜尋的篩選 條件。
  6. 完成下列其中一個步驟,驗證您的組態:
    • 針對應用程式或功能進行測試:按一下測試應用程式測試功能,然後按一下傳送請求。 若要在網頁中開啟應用程式或功能,請按一下應用程式 URL功能 URL。 您可以在平台日誌視窗中檢視測試的平台日誌。
    • 對於作業,請執行它:從作業執行區,按一下提交作業以執行您的作業。 提供作業執行設定值,或者您也可以使用預設值。 按一下提交作業以執行作業。 您可以在平台日誌視窗中檢視作業執行時的平台日誌。

您的 IBM Cloud Logs 範例已設定為可接收 Code Engine 應用程式、工作或功能的平台日誌。

另外,您也可以使用 Observability 面板 來建立 IBM Cloud Logs 範例,然後透過設定 平台日誌路由 來配置該範例。

從主控台檢視建立日誌

您可以從主控台顯示特定建立執行實體的記錄。

  1. 移至 Code Engine 儀表板。
  2. 選擇專案或建立專案。
  3. 從專案頁面,按一下影像建立
  4. 映像建立索引標籤,按一下您的映像建立名稱,以開啟已定義建立的建立頁面,或建立建立。
  5. 在已定義建構的建構頁面中,按一下 建立運行 區段中建構執行的實例名稱。 您可能需要按一下提交建立,以建立建立執行。 您可以在平台日誌視窗中檢視建置執行時的平台日誌。 另外,您也可以從建立執行實例頁面檢視建立步驟詳細資訊的建立記錄資訊。 展開建立步驟,取得特定的建立步驟記錄資料。 如有需要,您可以選擇精細 搜尋的篩選條件

使用 CLI 檢視日誌

要使用 CLI 檢視記錄輸出,您必須有一個正在執行的應用程式或工作實例。 如果應用程式縮放為零或作業執行實體完成,輸出為 ibmcloud ce app logsibmcloud 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"}