编写和查看应用程序、工作和功能的日志

日志记录可帮助您在 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 severities 中。 在以下各节中,您将进一步了解如何解析非结构化日志和结构化日志的日志级别,以及支持哪些日志级别值。

如果我的日志数据是多行数据怎么办?

要利用 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 中,该条目显示的严重性为错误,信息文本为“创建发票时支付服务超时”;您可以根据严重性 = 错误进行筛选,缩小结果范围。 您还可以使用解析和严重性规则来调整提取和匹配级别的方式,以适应您的环境。

当日志行的格式略有不同时,日志级别检测也能发挥作用,例如 LEVEL: MESSAGE[LEVEL] MESSAGE。 不过,在这些情况下,即使严重性仍被正确分类,也不会从日志信息中删除级别关键字。

此外,当任何受支持的关键字出现在信息的任何位置 (而不仅仅是开头)时,检测逻辑都能推断出严重程度。 例如,日志行:

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"。 但是,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 ( 泔水 )

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, ERRORError 等条目都映射到相同的严重性。 支持以下不区分大小写的严重性级别:critical, error, warn, info, debug,和 verbose。 如果支持的字段中包含这些值之一,则会提取日志级别,对其进行规范化处理,并在日志用户界面中用于过滤和分类。 例如,以下结构化日志行均可正确解释为错误级别:

{ "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 与 logstash-logback-encoder )

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

记录错误

要在结构化日志中捕获 两个 错误信息及其 堆栈跟踪,可生成一条 JSON 记录,其中包括标准字段 (level, message) 和 stack (或类似字段)。

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 与 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.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 应用程序、作业、函数或控制台中的构建页面添加日志功能。

要为任何平台服务生成日志,您只需为每个区域、每个账户启用一次日志记录。

从控制台查看日志的注意事项

要使用控制台日志时,必须首先配置 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"}