Schreiben und Anzeigen von Protokollen für Anwendungen, Aufträge und Funktionen

Mithilfe der Protokollierung können Sie Fehler in IBM Cloud® Code Engine beheben. Sie können die Protokolle über die Konsole oder die CLI anzeigen.

Interessiert an Logging für Flotten? Siehe Einrichten der Beobachtbarkeit für Flotten und Anzeigen von Protokollen und Überwachungsdaten für Flotten.

Protokolle schreiben

Lernen Sie, wie Sie in IBM Cloud® Code Engine effektiv Protokolle schreiben können, einschließlich bewährter Verfahren für Protokollformate, Schweregrade, Zeitstempel und den Umgang mit mehrzeiligen Einträgen sowohl für unstrukturierte als auch für strukturierte Protokollierung.

Überlegungen zum Schreiben von Protokollen

Schreiben von Protokollen auf Standardausgabe und Fehler

In Code Engine werden von Ihrem Workload ausgegebene Protokolleinträge nur dann gesammelt, wenn sie in stdout oder stderr geschrieben werden, wobei die Richtlinien der Zwölf-Faktoren-App befolgt werden, die empfehlen, Protokolle als Ereignisströme zu behandeln, anstatt Protokolldateien zu verwalten. Siehe Erstellen von Cloud-nativen Anwendungen: 12-Faktoren-Anwendungen - Faktor 11 - Protokolle.

Die Protokollierungspipeline der Plattform erfasst und verarbeitet diesen Output automatisch und macht ihn für die Analyse und Fehlerbehebung verfügbar. Protokollzeilen, die in Dateien im ephemeren Dateisystem des Containers geschrieben werden, werden nicht aufgenommen, persistiert oder über die Protokollierungsschnittstelle angezeigt. Folglich gehen alle im ephemeren Dateisystem gespeicherten Protokolle verloren, wenn die Instanz neu gestartet oder beendet wird, und stehen nicht für die Fehlersuche im Betrieb oder die Ursachenanalyse zur Verfügung.

Sollte ich meine Protokollzeilen mit Zeitstempeln versehen?

Von Benutzer-Workloads erzeugte Protokolldatensätze sollten keine eigenen Zeitstempelinformationen einbetten, da die Code Engine Infrastruktur Zeitstempel automatisch erfasst und standardisiert. Die Einbeziehung von Zeitstempeln auf Anwendungsebene kann zu Inkonsistenzen zwischen den Diensten führen, insbesondere wenn Arbeitslasten in verteilten oder containerisierten Umgebungen ausgeführt werden, in denen die Systemuhren abweichen oder sich verschieben können. Durch die Verwendung der Zeitstempel der Plattform werden einheitliche Zeitformate, eine genaue Abfolge und eine zuverlässige Korrelation mit anderen systemgenerierten Protokollen gewährleistet, was die Fehlerbehebung, die Prüfung und die Beobachtbarkeit in der gesamten Bereitstellung vereinfacht.

Wie werden meine Protokollstufen dem Schweregrad IBM Cloud Logs zugeordnet?

Die in jedem Protokolleintrag angegebene Protokollstufe wird den IBM Cloud Logs Schweregraden zugeordnet, wie in Zuordnung von Protokollschweregraden zu IBM Cloud Logs Schweregraden beschrieben. In den folgenden Abschnitten erfahren Sie mehr darüber, wie die Protokollebenen für unstrukturierte und strukturierte Protokolle geparst werden und welche Protokollebenenwerte unterstützt werden.

Was ist, wenn meine Protokolldaten mehrzeilig sind?

Um die Vorteile der Such- und Formatierungsfunktionen von IBM Cloud Logs zu nutzen, ändern Sie Ihre Protokollformatierung wie folgt.

  • Wenn sich Ihre Protokollzeilen über mehrere Zeilen erstrecken, sollten Sie die Formatierung und Ausgabe der Protokolle so ändern, dass sie in einer einzigen Zeile stehen. Verwenden Sie das JSONL-Format (siehe Protokollformate ) für Ihre Protokolle mit IBM Cloud Logs.
  • Ihre Protokolle müssen den Grenzwerten für IBM Cloud Logs entsprechen.

Protokollformate

Protokolldaten können in zwei gängigen Formaten ausgegeben werden: unstrukturiert und strukturiert.

  • Unstrukturierte Protokolle sind Freiformtexte, die einfach zu erstellen und für den Menschen lesbar sind, aber von Backend-Systemen nur schwer konsistent analysiert werden können. Dies schränkt eine zuverlässige Filterung und Korrelation ein.
  • Strukturierte Protokolle kodieren Felder in einem vorhersehbaren Schema (z. B. JSON) und ermöglichen Protokollpipelines die Indizierung und Abfrage von Attributen wie Anfrage-IDs, Benutzer-IDs oder domänenspezifischen Metadaten. Code Engine unterstützt JSON für strukturierte Protokolle, wodurch sichergestellt wird, dass Ihre benutzerdefinierten Felder maschinenlesbar und über Beobachtungstools hinweg leicht filterbar bleiben.

Wenn Sie vorhaben, die Protokollzeilen mit benutzerdefinierten, filterbaren Informationen anzureichern, verwenden Sie die strukturierte Protokollierung.

Unstrukturierte Protokolle

Beispiele

Im Folgenden finden Sie einfache Beispiele, die eine unstrukturierte Protokollzeile (Freiformtext) in die Standardausgabe schreiben.

Die Beispiele sind im öffentlichen Beispiel-Repository Code Engine unter https://github.com/IBM/CodeEngine/blob/main/logging/README.md veröffentlicht.

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

Erkennung des Loglevels

Jeder Protokolleintrag wird nach Schlüsselwörtern durchsucht, um den Schweregrad zu bestimmen. Die Schweregrade, die fallunsensitiv bewertet werden, sind critical, error, warn, info, debug und verbose.

Wenn eine Protokollzeile mit einem Schweregrad-Schlüsselwort im Format LEVEL MESSAGE beginnt, entfernt Code Engine den erkannten Schweregrad aus der angezeigten Protokollmeldung, damit sich die Benutzer auf den Kerninhalt konzentrieren können, während sie in der Ansicht IBM Cloud Logs weiterhin genau nach Schweregrad filtern können. In diesem Fall wird der extrahierte Schweregradwert im Feld level des Protokollsatzes gespeichert. Die folgenden von der Groß- und Kleinschreibung unabhängigen Schweregrade werden unterstützt: fatal, error, warn, info, debug, und trace. In Node.js könnten Sie zum Beispiel schreiben:

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

In IBM Cloud Logs erscheint dieser Eintrag mit dem Schweregrad Fehler und dem Meldungstext "Zeitüberschreitung des Zahlungsdienstes beim Erstellen der Rechnung "; Sie können dann nach Schweregrad = Fehler filtern, um die Ergebnisse einzugrenzen. Sie können auch Parsing- und Schweregradregeln verwenden, um die Extraktion und den Abgleich von Ebenen für Ihre Umgebung anzupassen.

Die Erkennung der Log-Ebene funktioniert auch, wenn die Log-Zeilen leicht unterschiedliche Formate haben, wie z.B. LEVEL: MESSAGE oder [LEVEL] MESSAGE. In diesen Fällen wird das Schlüsselwort "level" jedoch nicht aus der Protokollmeldung entfernt, obwohl der Schweregrad noch immer richtig eingestuft ist.

Außerdem kann die Erkennungslogik einen Schweregrad ableiten, wenn ein unterstütztes Schlüsselwort an beliebiger Stelle in der Nachricht erscheint, nicht nur am Anfang. Zum Beispiel die Protokollzeile:

The payment workflow encountered an unexpected error during validation

Diese Protokollzeile wird als Fehler eingestuft, da das Wort Fehler im Meldungstext erscheint.

Die Erkennung der Protokollierungsstufe berücksichtigt nicht den Eingangsstrom (stdout oder stderr) für die Erkennung der Protokollierungsstufe. Daher werden Protokollmeldungen, die in den Standardfehler (stderr) geschrieben werden, nur anhand des Meldungstextes ausgewertet. Zum Beispiel wird console.error("Some message") als Info eingestuft, obwohl es auf stderr geschrieben wird.

Bei Funktions-Workloads wird die Protokollebene nicht aus der angezeigten Protokollmeldung entfernt, selbst wenn sie am Anfang der Protokollzeile im Format LEVEL MESSAGE erkannt wird.

Parsing und Auswertung von Zeitstempeln

Das Hinzufügen von Zeitstempeln zu den Anwendungsprotokollzeilen wird nicht empfohlen, da Code Engine beim Einlesen der Protokolle automatisch einen normalisierten Zeitstempel zuweist. Wenn ein Zeitstempel am Anfang einer Protokollzeile steht, versucht das System, ihn zu analysieren. Wenn er mit einem der unterstützten Formate übereinstimmt, wird der Zeitstempel aus der angezeigten Protokollmeldung entfernt, ähnlich wie bei der Behandlung von Protokollebenen. Folgende Zeitstempelformate werden unterstützt:

  • 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

Wenn eine Protokollzeile am Anfang sowohl einen Zeitstempel als auch eine Protokollstufe enthält (z. B. TIMESTAMP LEVEL MESSAGE), wertet die Pipeline beide Felder aus. Wenn beide mit den unterstützten Mustern übereinstimmen, werden sie entsprechend klassifiziert und aus der gerenderten Protokollnachricht entfernt, so dass nur der Nachrichtentext zum leichteren Lesen und Filtern übrig bleibt. Zum Beispiel werden die folgenden Formate erfolgreich analysiert:

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

In Fällen, in denen ein Zeitstempel auftaucht, aber nicht mit den unterstützten Formaten übereinstimmt, bleibt er Teil der Protokollzeile und wird als normaler Text behandelt, aber der Rest der Nachricht wird weiterhin normal verarbeitet.

Bei Funktions-Workloads werden Zeitstempel nicht geparst, ausgewertet oder aus Protokollnachrichten entfernt. Jeder in den Funktionsprotokollen enthaltene Zeitstempel bleibt Teil der angezeigten Meldung.

Unterstützung für mehrere Leitungen

Code Engine unterstützt mehrzeilige Protokolleinträge. Bei der Ausgabe von Protokollen müssen Sie jedoch sicherstellen, dass Zeilenumbrüche (\n) ordnungsgemäß kodiert sind (\\n), damit die Protokollierungspipeline mehrzeilige Meldungen korrekt verarbeiten und darstellen kann. In Node.js können Sie zum Beispiel einen mehrzeiligen Protokolleintrag wie diesen erstellen:

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

Fehler protokollieren

Wenn Ihre Workload mehrzeilige Fehler-Stacktraces ausgibt, verwenden Sie das strukturierte JSON-Protokollformat anstelle der unstrukturierten Konsolenausgabe. Strukturierte Protokolle bewahren mehrzeilige Felder zuverlässig und stellen sicher, dass Stack Traces in einem einzigen Protokolleintrag gruppiert werden (siehe Abschnitt Strukturierte Protokolle ).

Die folgende Protokollmeldung wird beispielsweise als Fehler eingestuft, da das Schlüsselwort "error" in der Protokollmeldung erscheint. Der Stack-Trace, der vom err Objekt bereitgestellt wird, wird jedoch in mehreren Protokollzeilen dargestellt.

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

Strukturierte Protokolle

Beispiele

Es folgen minimale strukturierte Protokollierungsbeispiele für jede Sprache und Laufzeit, die ein einzelnes JSON mit der Protokollstufe im Feld level und der Protokollmeldung im Feld message ausgeben.

Die Beispiele sind im öffentlichen Beispiel-Repository Code Engine unter https://github.com/IBM/CodeEngine/blob/main/logging/README.md veröffentlicht.

Node.js ( winston )

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 ( Loguru )

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 ( SLF4J und Logback mit 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");
  }
}

Erkennung des Loglevels

Jeder Protokolleintrag wird nach Schlüsselwörtern durchsucht, um den Schweregrad zu bestimmen. Die Schweregrade, die fallunsensitiv bewertet werden, sind critical, error, warn, info, debug und verbose.

Wenn Sie strukturierte Protokolle verwenden, erkennt Code Engine automatisch die Protokollebene, wenn sie in einem der folgenden Felder angegeben wird: level, severity, oder logLevel. Der Wert in diesen Feldern ist unabhängig von der Groß- und Kleinschreibung, d. h. Einträge wie error, ERROR oder Error entsprechen alle demselben Schweregrad. Die folgenden von der Groß- und Kleinschreibung unabhängigen Schweregrade werden unterstützt: critical, error, warn, info, debug, und verbose. Wenn ein unterstütztes Feld vorhanden ist und einen dieser Werte enthält, wird die Protokollstufe extrahiert, normalisiert und für die Filterung und Kategorisierung in der Benutzeroberfläche für Protokolle verwendet. Die folgenden strukturierten Protokollzeilen werden beispielsweise alle korrekt mit der Stufe Fehler interpretiert:

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

Unabhängig von der Großschreibung oder dem spezifischen Feldwert identifiziert die Plattform die Protokollebene korrekt und wendet sie zum Filtern, Gruppieren und Analysieren Ihrer strukturierten Protokolldaten an.

Auswertung des Zeitstempels

Bei strukturierten Protokollen werden benutzerdefinierte Zeitstempel nicht geparst oder ausgewertet. Alle Zeitstempelfelder, die Sie angeben, werden als reine Nutzdaten behandelt, während die Plattform immer ihren eigenen Aufnahmezeitstempel für die Ordnung und Filterung verwendet.

Im folgenden Beispiel wird der Wert "timestamp" beibehalten, aber für die Protokollierung ignoriert.

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

Hinzufügen zusätzlicher Kontextinformationen

Sie können strukturierte Protokolle mit benutzerdefinierten Feldern anreichern (z. B. requestId, userId oder domänenspezifische Metadaten). Nachfolgend finden Sie Minimalbeispiele für jeden zuvor verwendeten Stapel.

Halten Sie benutzerdefinierte Felder kurz und stabil (z. B. IDs, Codes oder kleine Enums), um die Filterbarkeit zu maximieren und die Kardinalität in Ihrer Protokollierungsinstanz zu minimieren.

Node.js ( winston )

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

Python ( Loguru )

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 ( SLF4J und Logback mit logstash-logback-encoder )

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

Fehler protokollieren

Um sowohl die Fehlermeldung als auch die Stapelverfolgung in strukturierten Protokollen zu erfassen, geben Sie einen JSON-Datensatz aus, der Ihre Standardfelder (level, message) sowie ein stack (oder ein ähnliches) Feld enthält.

Node.js ( winston )

// 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 ( Loguru )

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 ( SLF4J und Logback mit 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");
}

Funktions-Workloads verarbeiten mehrzeilige Protokolle, aber jedes Zeilenumbruchzeichen führt zu einem separaten Protokolleintrag. Bei der Protokollierung von Stack Traces mit strukturierten Logging-Frameworks müssen Sie möglicherweise Zeilenumbrüche manuell ausblenden, um sicherzustellen, dass sie ordnungsgemäß als ein einzelner Protokolleintrag dargestellt werden.

Felder für die Protokollierung

Code Engine protokollierungsfelder.
Feldname Beschreibung Beispielwert
app Der Dienst IBM Cloud, der die Protokollzeile der Plattform ausgegeben hat. Für Code Engine wird dies immer codeengine sein. codeengine
tag Feld, das von fluentbit festgelegt und von der in der fluentbit-Konfiguration festgelegten Eingabe-ID abgeleitet wird. platform.<id>.codeengine
stream Der Ausgabestrom, der den Protokollsatz empfangen hat. Mögliche Werte: stdout oder stderr
originator Zeigt an, ob eine Code Engine Systemkomponente oder Benutzer-Workload die Protokollzeile ausgegeben hat. system oder user
resourceGroupId Ressourcengruppe CRN für das Projekt Code Engine. <resource group CRN>
messageKey Optionaler eindeutiger, von Menschen lesbarer Bezeichner zum Filtern von Protokollen und zur Fehlerbehebung. Benutzerdefinierte Zeichenfolge
codeengine.region Region des Projekts Code Engine. us-south
codeengine.project Name des Projekts Code Engine. Benutzerdefinierte Zeichenfolge
codeengine.projectGuid GUID des Projekts Code Engine. <project GUID>
codeengine.projectSubdomain Namespace des Projekts Code Engine. edf5a781
codeengine.componentType Komponententyp, von dem die Protokollzeile stammt. Mögliche Werte: app, job, job_run, fleet, function, build, build_run, container
codeengine.component Komponentenname, der die Protokollzeile ausgegeben hat. Benutzerdefinierte Zeichenfolge
codeengine.subcomponentType Typ der Unterkomponente, von der die Protokollzeile stammt. Mögliche Werte: app_revision, job_run, fleet_instance, function, build_run, container
codeengine.subcomponent Name der Unterkomponente, von der die Protokollzeile stammt. Benutzerdefinierte Zeichenfolge
codeengine.instanceId Pod-Name (für Anwendungen, Jobs und Builds) oder Container-Instanz-ID (für Funktionen und Flotten). my-app-0001-pod-abcde
label.Namespace Veraltet. Der Name der Subdomäne des Projekts Code Engine. Verwenden Sie stattdessen codeengine.projectSubdomain. Dieses Feld wird nach dem 15. Juni 2026 gestrichen. edf5a781
label.Project Veraltet. Der Name des Projekts Code Engine. Verwenden Sie stattdessen codeengine.project. Dieses Feld wird nach dem 15. Juni 2026 gestrichen. Benutzerdefinierte Zeichenfolge
label.Stream Veraltet. Der Ausgabestrom, der den Protokollsatz empfangen hat. Verwenden Sie stattdessen stream. Dieses Feld wird nach dem 15. Juni 2026 gestrichen. Mögliche Werte: stdout oder stderr
level Optional. Legt den Schweregrad der Protokollmeldung fest. Dieser Wert wird nur gesetzt, wenn die Protokollstufe aus einer unstrukturierten Protokollmeldung extrahiert werden konnte. Groß- und Kleinschreibung werden nicht berücksichtigt. Mögliche Werte: fatal, error, warn, info, debug, trace
logtag Veraltet. Optional. Gibt an, ob es sich bei der empfangenen Protokollzeile um eine teilweise oder vollständige Protokollzeile handelt. Dieses Feld ist für Funktions-Workloads nicht gesetzt. Dieses Feld wird nach dem 15. Juni 2026 ersatzlos gestrichen. Mögliche Werte: F oder P
message.message Die von Menschen lesbare Logmeldung. Von der Systemkomponente oder dem Benutzer definierter String
message.logSourceCRN Die CRN des Projekts Code Engine. <code engine project CRN>
message.saveServiceCopy Veraltet. Legt fest, ob die Protokollzeile der Plattform auch in die Systemprotokolle von IBM Cloud® Code Engine kopiert werden soll. Dieses Feld wird nach dem 15. Juni 2026 ersatzlos gestrichen. false
message.serviceName Veraltet. Der Name des IBM Cloud Dienstes, der diese Protokollzeile ausgegeben hat. Verwenden Sie stattdessen app. Dieses Feld wird nach dem 15. Juni 2026 gestrichen. codeengine
message._app Veraltet. Der Instanzname (für Anwendungen, Jobs und Builds) oder der Komponentenname (für Funktionen). Verwenden Sie stattdessen codeengine.instanceId, codeengine.component, oder beides. Dieses Feld wird nach dem 15. Juni 2026 gestrichen. my-app-0001-pod-abcde
message.* Optional. Meta-Informationen, die dem Benutzer bei der Erstellung von Dashboards oder Warnmeldungen nützlich sind. durationSeconds

Protokolle in der Konsole anzeigen

Wenn Sie mit Code Engine Anwendungen, Jobs, Funktionen oder Builds in der Konsole arbeiten und die Protokollierung aktiviert ist, werden die Protokolle an einen IBM Cloud Logs Dienst weitergeleitet, wo sie indiziert werden, so dass eine Volltextsuche durch alle generierten Nachrichten und eine bequeme Abfrage auf der Grundlage bestimmter Felder möglich ist.

Die Instanz IBM Cloud Logs, die die Plattformprotokolle empfängt, muss sich nicht in derselben Region befinden wie Ihr Code Engine Projekt, und Sie müssen diese Instanz nicht erstellen, bevor Sie mit Ihrer Code Engine Komponente arbeiten. Sie können jederzeit über Ihre Code Engine App, Ihren Job, Ihre Funktion oder Ihre Build-Seite in der Konsole Protokollierungsfunktionen hinzufügen.

Um Protokolle für jeden Plattformdienst zu erstellen, müssen Sie die Protokollierung nur einmal pro Region und pro Konto aktivieren.

Überlegungen zur Anzeige von Protokollen über die Konsole

Wenn Sie die Protokollierung von der Konsole aus nutzen möchten, müssen Sie zunächst die IBM Cloud Logs Plattformprotokolle so konfigurieren, dass sie Code Engine Protokollierungsdaten mit IBM Cloud Logs Routing empfangen. Um zu prüfen, ob die Instanzen von IBM Cloud Logs aktiv sind, sehen Sie sich das Observability Dashboard an.

Prüfen Sie die Informationen des IBM Cloud Logs Serviceplans, wenn Sie die Anforderungen an Aufbewahrung, Suche und Protokollanalyse berücksichtigen.

Wenn Sie Protokolldaten für Code Engine Anwendungen, Läufe Ihres Auftrags oder Läufe Ihres Builds anzeigen, kann es zu Verzögerungen kommen, bevor die Daten in IBM Cloud Logs verfügbar sind. Es kann beispielsweise etwa 5 bis 10 Minuten dauern, bis Ihre Protokolldaten in IBM Cloud Logs angezeigt werden, insbesondere wenn Sie die Datenpipeline Store and search verwenden.

Lesen Sie die Dokumentation zu Data Pipelines, um mehr über die Optionen zum Ausgleich von Protokolllatenz und Kosten für Ihre IBM Cloud Logs Instanzen zu erfahren.

Wenn Sie die Protokollierung mit der CLI verwenden, müssen Sie die IBM Cloud Logs Plattformprotokolle nicht konfigurieren, da die Code Engine CLI-Protokollierung ihre Daten anders abruft.

Die über die Befehlszeilenschnittstelle angebotenen Protokollierungsfunktionen sind begrenzt und sollten nur für Entwicklungszwecke verwendet werden. Wenn Sie Produktions-Workloads ausführen, verwenden Sie immer eine IBM Cloud Logs-Instanz, die Protokollspeicher-, Filter- und Suchfunktionen bietet.

Kann ich Filter auf IBM Cloud Logs Daten anwenden?

Sie können den Filter modifizieren und erweitern, um Protokolldaten auf einer bestimmten Ebene oder auf einer detaillierteren Ebene für eine bestimmte Anwendungsrevision, einen Joblauf oder einen Build-Lauf auf der Seite IBM Cloud Logs anzuzeigen, je nach Bedarf.

  • Wenn app:"codeengine" eingestellt ist, werden nur die Protokolle von Code Engine angezeigt.

  • Wenn codeengine.project:'<project_name>' eingestellt ist, werden nur Protokolle von einem bestimmten Projekt angezeigt.

  • Wenn codeengine.component:'<your_component_name>' gesetzt ist, werden nur Protokolle der angegebenen Komponente (Anwendung, Job oder Build) angezeigt. Wenn Ihre Code Engine Komponenten den gleichen Namen haben, schließt der Filter die Protokolle dieser Komponenten ein. Beispiel:

    • Der Filter app:"codeengine" AND codeengine.component:"myapp" beschränkt die Protokolle auf die Anwendungsebene myapp.
    • Der Filter app:"codeengine" AND codeengine.subcomponent:"myapp\-00002" beschränkt die Protokolle auf die Anwendungsrevisionsebene myapp-0002.
    • Mit dem Filter app:"codeengine" AND codeengine.component:"myjob" werden die Protokolle auf die spezifische Auftragsebene myjob eingeschränkt.
    • Der Filter app:"codeengine" AND codeengine.subcomponent:"myjob\-jobrun\-t6m7l" beschränkt die Protokolle auf die spezifische Ebene des myjob-jobrun-t6m7l Joblaufs.
    • Der Filter app:"codeengine" AND codeengine.component:"mybuild" beschränkt die Protokolle auf die spezifische mybuild build level.
    • Der Filter app:"codeengine" AND codeengine.subcomponent:"mybuild\-run\-121212" beschränkt die Protokolle auf den spezifischen mybuild-run-121212 build run level.

Weitere Informationen zum Konfigurieren und Starten der Protokollierung in der Konsole finden Sie unter Anzeigen von Anwendungs-, Auftrags- oder Funktionsprotokollen über die Konsole.

Anzeigen von Anwendungs-, Auftrags- oder Funktionsprotokollen über die Konsole

Sie können Protokolle für Anwendungen, Aufträge oder Funktionen anzeigen. Die Schritte, um diese über die Konsole anzuzeigen, sind sehr ähnlich.

Nachdem Sie das Projekt ausgewählt haben, mit dem Sie arbeiten möchten, können Sie auf der Übersichtsseite Code Engine oder einer der untergeordneten Seiten, wie z. B. der Seite Anwendungen, Jobs oder Funktionen, oder auf der Seite, die für Ihre Anwendung, Ihren Job oder Ihre Funktion spezifisch ist, Protokollierungsfunktionen hinzufügen. Bei den folgenden Schritten wird davon ausgegangen, dass Sie von einer bestimmten Seite Code Engine aus arbeiten.

  1. Gehen Sie zu einer Anwendung, einem Auftrag oder einer Funktion, die Sie erstellt und bereitgestellt haben. Wählen Sie auf der Seite Projekte in der Konsole Code Engine Ihr Projekt aus und wählen Sie dann je nach Bedarf Anwendungen, Jobs oder Funktionen. Wählen Sie die Anwendung, den Auftrag oder die Funktion aus, mit der Sie arbeiten möchten.
  2. Wenn Sie zuvor eine Instanz von IBM Cloud Logs erstellt haben, klicken Sie auf Protokollierung, um den Dienst IBM Cloud Logs zu öffnen.
  3. Führen Sie die folgenden Schritte aus, um Protokollierungsfunktionen hinzuzufügen und zu konfigurieren:
    1. Klicken Sie im Optionsmenü Testanwendung, Auftrag einreichen oder Testfunktion auf Protokollierung hinzufügen, um die Instanz IBM Cloud Logs zu erstellen. Durch diese Aktion wird der IBM Cloud Logs-Service geöffnet.
    2. Erstellen Sie im IBM Cloud Logs-Service die Protokollierungsinstanz. Überprüfen Sie anhand des Dashboards für die Beobachtbarkeit, ob die Protokollierungsinstanz erstellt wurde.
    3. Klicken Sie auf Ihrer Code Engine Anwendungs-, Auftrags- oder Funktionsseite im Optionsmenü Testanwendung, Auftrag einreichen oder Testfunktion auf Protokollierung hinzufügen. Wählen Sie diesmal eine IBM Cloud Logs Instanz aus, die Plattformprotokolle erhalten soll. Wählen Sie die Protokollierungsinstanz, die Sie im vorherigen Schritt erstellt haben. Klicken Sie auf Auswählen. Code Engine benötigt aktivierte Plattformprotokolle, um Code Engine Protokolldaten zu empfangen. Wenn Sie diese Aktion abschließen, aktiviert Code Engine die Plattformprotokollierung für Sie.
  4. Nachdem Sie die Plattformprotokolle konfiguriert haben, klicken Sie auf der Seite Code Engine im Optionsmenü Testanwendung, Auftrag einreichen oder Testfunktion auf Protokollierung, um das Fenster mit den Plattformprotokollen zu öffnen. Vergewissern Sie sich im Dashboard für die Beobachtbarkeit, dass für Ihre Region Plattformprotokolle festgelegt sind.
  5. (optional) Verfeinern Sie den Filter für Ihre Suche, falls erforderlich.
  6. Überprüfen Sie Ihre Konfiguration, indem Sie einen der folgenden Schritte ausführen:
    • Testen Sie eine Anwendung oder eine Funktion: Klicken Sie auf Anwendung testen bzw. Funktion testen und dann auf Anfrage senden. Um die Anwendung oder Funktion in einer Webseite zu öffnen, klicken Sie auf Anwendung URL oder Funktion URL. Sie können die Plattformprotokolle des Tests im Fenster Plattformprotokolle anzeigen.
    • Führen Sie einen Auftrag aus: Klicken Sie im Bereich Auftragsausführung auf Auftrag einreichen, um Ihren Auftrag auszuführen. Geben Sie Konfigurationswerte für die Jobausführung an oder übernehmen Sie die Standardwerte. Klicken Sie auf Job übergeben, um den Job auszuführen. Sie können die Plattformprotokolle des Auftragslaufs im Fenster Plattformprotokolle anzeigen.

Ihre IBM Cloud Logs Instanz ist nun so konfiguriert, dass sie Plattformprotokolle für Ihre Code Engine Anwendung, Ihren Job oder Ihre Funktion empfangen kann.

Alternativ können Sie eine IBM Cloud Logs-Instanz konfigurieren, indem Sie das Observability-Dashboard verwenden, um die Instanz zu erstellen, und dann das Routing der Plattformprotokolle konfigurieren.

Buildprotokolle über die Konsole anzeigen

Sie können Protokolle für bestimmte Instanzen von Buildausführungen über die Konsole anzeigen.

  1. Rufen Sie das Code Engine-Dashboard auf.
  2. Wählen Sie ein Projekt aus oder erstellen Sie eines.
  3. Klicken Sie auf der Projektseite auf Image-Builds.
  4. Klicken Sie auf der Registerkarte Image-Build auf den Namen Ihres Image-Builds, um die Build-Seite für ein definiertes Build zu öffnen, oder erstellen Sie ein Build.
  5. Klicken Sie auf der Buildseite für Ihren definierten Build im Abschnitt Buildausführungen auf den Namen der Instanz Ihrer Buildausführung. Möglicherweise müssen Sie auf Build übergeben klicken, um eine Buildausführung zu erstellen. Sie können die Plattformprotokolle des Build-Laufs im Fenster Plattformprotokolle anzeigen. Alternativ können Sie die Build-Protokollinformationen für die Details des Build-Schritts auch auf der Seite der Build-Run-Instanz anzeigen. Erweitern Sie die Build-Steps für spezifische Build-Step-Protokolldaten. Sie können den Filter für Ihre Suche bei Bedarf verfeinern.

Protokolle über die Befehlszeilenschnittstelle anzeigen

Um die Protokollierungsausgabe mit der CLI anzuzeigen, muss eine Instanz Ihrer Anwendung oder Ihres Auftrags laufen. Wenn eine Anwendung auf Null skaliert oder eine Job-Laufinstanz beendet wird, wird die Ausgabe für die ibmcloud ce app logs und ibmcloud ce jobrun logs befehle keine Protokolldaten enthalten. Alternativ können Sie den Dienst IBM Cloud Logs verwenden, um Protokolldaten anzuzeigen.

Anwendungsprotokolle über die Befehlszeilenschnittstelle anzeigen

Verwenden Sie den Befehl application logs, um die App-Protokolle für eine bestimmte App in der Befehlszeilenschnittstelle (CLI) anzuzeigen. Sie können Protokolle aller Instanzen einer App oder einer bestimmten Instanz einer App anzeigen. Bei Verwendung des Befehls app get werden Details zur App angezeigt, unter anderem die aktiven Instanzen der App.

  • Um die Protokolle für alle Instanzen der Anwendung myapp anzuzeigen, geben Sie den Namen der Anwendung mit der Option --app an. Zum Beispiel:

    ibmcloud ce app logs --app myapp
    

    Beispielausgabe

    Getting logs for all instances of application 'myapp'...
    OK
    
    myapp-ii18y-2-deployment-7657c5f4f9-dgk5f:
    Server running at http://0.0.0.0:8080/
    
  • Um die Protokolle für eine bestimmte Instanz der Anwendung anzuzeigen, geben Sie den Namen der spezifischen Instanz der Anwendung mit der Option --instance an. Zum Beispiel:

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

    Beispielausgabe

    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/
    

Jobprotokolle über die Befehlszeilenschnittstelle anzeigen

Verwenden Sie den Befehl jobrun logs, um die Protokolle für eine bestimmte Jobausführung in der Befehlszeilenschnittstelle anzuzeigen. Sie können Protokolle aller Instanzen einer Jobausführung oder Protokolle einer bestimmten Instanz einer Jobausführung anzeigen. Mit dem Befehl jobrun get können Sie Details zur Jobausführung anzeigen, einschließlich der Instanzen der Jobausführung.

  • Um die Protokolle für alle Instanzen des Joblaufs testjobrun anzuzeigen, geben Sie den Namen des Joblaufs mit der Option --jobrun an. Zum Beispiel:

    ibmcloud ce jobrun logs --jobrun testjobrun
    

    Beispielausgabe

    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!
    
  • Um die Protokolle für die Instanz des Joblaufs testjobrun-1-0 anzuzeigen, geben Sie den Namen einer bestimmten Instanz des Joblaufs mit der Option --instance an. Zum Beispiel:

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

    Beispielausgabe

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

Buildprotokolle über die Befehlszeilenschnittstelle anzeigen

Verwenden Sie den Befehl buildrun logs, um die Buildprotokolle für eine bestimmte Buildausführung in der Befehlszeilenschnittstelle anzuzeigen. Sie können Protokolle aller Instanzen einer Buildausführung basierend auf dem Namen der Buildausführung anzeigen.

Um die Protokolle für alle Instanzen des Erstellungslaufs mybuildrun anzuzeigen, geben Sie den Namen des Erstellungslaufs mit der Option --name an. Zum Beispiel:

ibmcloud ce buildrun logs --name mybuildrun

Beispielausgabe

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"}