Scrivere e visualizzare i log per le applicazioni, i lavori e le funzioni

La registrazione può aiutare a risolvere i problemi in IBM Cloud® Code Engine. È possibile visualizzare i registri utilizzando la console o la CLI.

Siete interessati alla registrazione per le flotte? Vedere Impostazione dell'osservabilità per le flotte e Visualizzazione dei registri e dei dati di monitoraggio per le flotte.

Diari di scrittura

Imparate a scrivere i log in modo efficace in IBM Cloud® Code Engine, comprese le migliori pratiche per i formati dei log, i livelli di gravità, i timestamp e la gestione delle voci multilinea per i log non strutturati e strutturati.

Considerazioni sulla scrittura dei log

Scrittura dei log su standard output ed errore

In Code Engine, i record di log emessi dal carico di lavoro vengono raccolti solo quando vengono scritti in stdout o stderr, seguendo le linee guida di Twelve-Factor App che raccomandano di trattare i log come flussi di eventi piuttosto che gestire file di log. Vedere Creazione di applicazioni cloud-native: applicazioni a 12 fattori - Fattore 11 - Log.

La pipeline di registrazione della piattaforma acquisisce ed elabora automaticamente questo output, rendendolo disponibile per l'analisi e la risoluzione dei problemi. Le righe di log scritte nei file del file system effimero del contenitore non vengono ingerite, persistite o esposte attraverso l'interfaccia di log. Di conseguenza, i registri memorizzati sul file system effimero vengono persi quando l'istanza viene riavviata o terminata e non sono disponibili per il debugging operativo o l'analisi delle cause principali.

Devo aggiungere i timestamp alle mie linee di log?

I record di log generati dai carichi di lavoro degli utenti dovrebbero evitare di incorporare le proprie informazioni di timestamp, perché l'infrastruttura Code Engine acquisisce e standardizza automaticamente i timestamp. L'inclusione di timestamp a livello di applicazione può creare incoerenze tra i servizi, soprattutto quando i carichi di lavoro vengono eseguiti in ambienti distribuiti o containerizzati, dove gli orologi di sistema possono essere diversi o spostati. Affidarsi ai timestamp della piattaforma garantisce formati temporali uniformi, sequenze accurate e correlazioni affidabili con altri log generati dal sistema, semplificando la risoluzione dei problemi, l'auditing e l'osservabilità dell'intera implementazione.

Come si configurano i livelli di log rispetto alla severità di IBM Cloud Logs?

Il livello di log fornito in ciascun record di log viene mappato ai livelli di severità di IBM Cloud Logs come descritto in Mappatura dei livelli di severità del log ai livelli di severità di IBM Cloud Logs. Nelle sezioni seguenti vengono fornite ulteriori informazioni su come vengono analizzati i livelli di registro per i registri non strutturati e strutturati e sui valori dei livelli di registro supportati.

Cosa succede se i dati di log sono multilinea?

Per sfruttare le funzioni di ricerca e formattazione di IBM Cloud Logs, modificare la formattazione dei registri come segue.

  • Se le linee di log si estendono su più righe, modificate il modo in cui formattate e producete i log in modo che siano su una sola riga. Utilizzare il formato JSONL (vedere Formati dei log ) per i log con IBM Cloud Logs.
  • I vostri registri devono essere conformi ai limiti di IBM Cloud Logs.

Formati dei registri

I dati di log possono essere emessi in due formati comuni: non strutturato e strutturato.

  • I log non strutturati sono testi in forma libera, semplici da produrre e leggibili dall'uomo, ma difficili da analizzare in modo coerente per i sistemi di backend. Ciò limita l'affidabilità del filtraggio e della correlazione.
  • I log strutturati codificano i campi in uno schema prevedibile (ad esempio, JSON), consentendo alle pipeline di log di indicizzare e interrogare attributi come ID richiesta, ID utente o metadati specifici del dominio. Code Engine supporta JSON per i log strutturati, il che contribuisce a garantire che i campi personalizzati rimangano leggibili dalla macchina e facilmente filtrabili attraverso gli strumenti di osservabilità.

Se si intende arricchire le righe di log con informazioni personalizzate e filtrabili, utilizzare la registrazione strutturata.

Registri non strutturati

Esempi

Di seguito sono riportati semplici esempi che scrivono una riga di log non strutturata (testo libero) sullo standard output.

Gli esempi sono pubblicati nel repository pubblico di esempi Code Engine all'indirizzo 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");
    }
}

Rilevamento del livello di log

Ogni record di registro viene analizzato alla ricerca di parole chiave per determinare la gravità. I valori di gravità, valutati in modo insensibile, sono critical, error, warn, info, debug e verbose.

Se una riga di registro inizia con una parola chiave di gravità nel formato LEVEL MESSAGE, Code Engine rimuove il livello rilevato dal messaggio di registro visualizzato, in modo che gli utenti possano concentrarsi sul contenuto principale, pur continuando a filtrare con precisione in base alla gravità nella vista IBM Cloud Logs. In questo caso, il valore di gravità estratto viene memorizzato nel campo del record di log level. Sono supportati i seguenti livelli di gravità senza distinzione tra maiuscole e minuscole: fatal, error, warn, info, debug, e trace. Ad esempio, in Node.js si potrebbe scrivere:

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

In IBM Cloud Logs, questa voce appare con la gravità Errore e il testo del messaggio "Timeout del servizio di pagamento durante la creazione della fattura "; è quindi possibile filtrare per Gravità = Errore per restringere i risultati. È inoltre possibile utilizzare le regole di parsing e di severità per adattare il modo in cui i livelli vengono estratti e abbinati al proprio ambiente.

Il rilevamento del livello di log funziona anche quando le linee di log seguono formati leggermente diversi, come LEVEL: MESSAGE o [LEVEL] MESSAGE. Tuttavia, in questi casi la parola chiave livello non viene rimossa dal messaggio di log, anche se la gravità è ancora classificata correttamente.

Inoltre, la logica di rilevamento può dedurre un livello di gravità quando una parola chiave supportata compare in qualsiasi punto del messaggio, non solo all'inizio. Ad esempio, la linea di log:

The payment workflow encountered an unexpected error during validation

Questa riga di registro è classificata come Errore perché nel testo del messaggio compare la parola errore.

Il rilevamento del livello di log non considera il flusso di ingresso (stdout o stderr) per il rilevamento del livello di log. Pertanto, i messaggi di log scritti sullo standard error (stderr) vengono valutati esclusivamente in base al testo del messaggio. Ad esempio, console.error("Some message") è classificato come Info, anche se viene scritto su stderr.

Per i carichi di lavoro funzionali, il livello di log non viene rimosso dal messaggio di log visualizzato, anche quando viene rilevato all'inizio della riga di log nel formato LEVEL MESSAGE.

Analisi e valutazione dei timestamp

L'aggiunta di timestamp alle linee di log delle applicazioni non è consigliata perché Code Engine assegna automaticamente un timestamp normalizzato quando i log vengono ingeriti. Se un timestamp è incluso all'inizio di una riga di log, il sistema tenta di analizzarlo. Se corrisponde a uno dei formati supportati, il timestamp viene rimosso dal messaggio di log visualizzato, in modo simile a come vengono gestiti i livelli di log. I formati di timestamp supportati includono:

  • 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

Quando una riga di log contiene sia un timestamp che un livello di log all'inizio (ad esempio, TIMESTAMP LEVEL MESSAGE), la pipeline valuta entrambi i campi. Se entrambi corrispondono agli schemi supportati, vengono classificati in modo appropriato e rimossi dal messaggio di log renderizzato, lasciando solo il corpo del messaggio per facilitare la lettura e il filtraggio. Ad esempio, i seguenti formati vengono analizzati con successo:

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

Nei casi in cui un timestamp compare ma non corrisponde ai formati supportati, rimane parte della riga di log e viene trattato come testo normale, ma il resto del messaggio viene comunque elaborato normalmente.

Per i carichi di lavoro funzionali, i timestamp non vengono analizzati, valutati o rimossi dai messaggi di log. Qualsiasi timestamp incluso nei log delle funzioni rimane parte del messaggio visualizzato.

Supporto multilinea

Code Engine supporta voci di registro multilinea. Tuttavia, quando si emettono i log, è necessario assicurarsi che i caratteri di newline (\n) siano codificati correttamente (\\n), in modo che la pipeline di log possa elaborare e rendere correttamente i messaggi multilinea. Ad esempio, in Node.js, si può produrre una voce di log multilinea come questa:

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

Errori di registrazione

Se il carico di lavoro emette tracce di stack di errore a più righe, utilizzare il formato di log JSON strutturato invece dell'output non strutturato della console. I log strutturati conservano in modo affidabile i campi multilinea e assicurano che le tracce di stack siano raggruppate in un unico record di log, come descritto nella sezione Log strutturati.

Ad esempio, il seguente messaggio di log è classificato come Errore perché nel messaggio di log compare la parola chiave "error". Tuttavia, la traccia dello stack fornita dall'oggetto err viene resa in più righe di log.

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

Registri strutturati

Esempi

Di seguito sono riportati esempi minimi di log strutturato per ogni linguaggio e runtime che emettono un singolo JSON con il livello di log nel campo level e il messaggio di log nel campo message.

Gli esempi sono pubblicati nel repository pubblico di esempi Code Engine all'indirizzo https://github.com/IBM/CodeEngine/blob/main/logging/README.md.

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

Rilevamento del livello di log

Ogni record di registro viene analizzato alla ricerca di parole chiave per determinare la gravità. I valori di gravità, valutati in modo insensibile, sono critical, error, warn, info, debug e verbose.

Quando si utilizzano log strutturati, Code Engine rileva automaticamente il livello di log quando viene fornito in uno dei seguenti campi: level, severity, o logLevel. Il valore di questi campi non fa distinzione tra maiuscole e minuscole, quindi voci come error, ERROR o Error corrispondono tutte alla stessa gravità. Sono supportati i seguenti livelli di gravità senza distinzione tra maiuscole e minuscole: critical, error, warn, info, debug, e verbose. Quando un campo supportato è presente e contiene uno di questi valori, il livello del registro viene estratto, normalizzato e utilizzato per il filtraggio e la categorizzazione nell'interfaccia utente dei registri. Ad esempio, le seguenti righe di log strutturate sono tutte correttamente interpretate con il livello Errore:

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

Indipendentemente dalla capitalizzazione o dal valore specifico del campo utilizzato, la piattaforma identifica correttamente il livello di log e lo applica per filtrare, raggruppare e analizzare i dati di log strutturati.

Valutazione del timestamp

Per i registri strutturati, i timestamp personalizzati non vengono analizzati o valutati. Qualsiasi campo timestamp fornito dall'utente viene trattato esclusivamente come dato di payload, mentre la piattaforma applica sempre il proprio timestamp di ingestione per l'ordinamento e il filtraggio.

Nell'esempio seguente, il valore "timestamp" viene conservato ma ignorato per i tempi di registrazione.

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

Aggiunta di ulteriori informazioni sul contesto

È possibile arricchire i log strutturati con campi personalizzati (ad esempio, requestId, userId, o metadati specifici del dominio). Di seguito sono riportati esempi minimi per ogni pila utilizzata in precedenza.

Mantenere i campi personalizzati concisi e stabili (ad esempio, ID, codici o piccoli enum) per massimizzare la filtrabilità e minimizzare la cardinalità nell'istanza di registrazione.

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 e Logback con logstash-logback-encoder )

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

Errori di registrazione

Per catturare sia il messaggio di errore che la sua traccia di stack in log strutturati, emettere un record JSON che includa i campi standard (level, message) più un campo stack (o simile).

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

I carichi di lavoro delle funzioni gestiscono registri a più righe, ma ogni carattere newline risulta in una voce di registro separata. Quando si registrano le tracce di stack con framework di registrazione strutturati, potrebbe essere necessario eseguire l'escape manuale dei caratteri di newline per assicurarsi che vengano resi correttamente come una singola voce di log.

Campi di registrazione

Code Engine campi di registrazione.
Nome campo Descrizione Valore di esempio
app Il servizio IBM Cloud che ha emesso la riga di log della piattaforma. Per Code Engine, questo sarà sempre codeengine. codeengine
tag Campo impostato da fluentbit e derivato dall'ID di ingresso impostato nella configurazione di fluentbit. platform.<id>.codeengine
stream Il flusso di uscita che ha ricevuto il record di registro. Valori possibili: stdout o stderr
originator Indica se un componente del sistema Code Engine o un carico di lavoro utente ha emesso la riga di registro. system oppure user
resourceGroupId Gruppo di risorse CRN per il progetto Code Engine. <resource group CRN>
messageKey Identificatore unico opzionale, leggibile dall'uomo, per il filtraggio dei registri e la risoluzione dei problemi. Stringa definita dall'utente
codeengine.region Regione del progetto Code Engine. us-south
codeengine.project Nome del progetto Code Engine. Stringa definita dall'utente
codeengine.projectGuid GUID del progetto Code Engine. <project GUID>
codeengine.projectSubdomain Spazio dei nomi del progetto Code Engine. edf5a781
codeengine.componentType Tipo di componente che ha emesso la riga di registro. Valori possibili: app, job, job_run, fleet, function, build, build_run, container
codeengine.component Nome del componente che ha emesso la riga di registro. Stringa definita dall'utente
codeengine.subcomponentType Tipo di sottocomponente che ha emesso la riga di registro. Valori possibili: app_revision, job_run, fleet_instance, function, build_run, container
codeengine.subcomponent Nome del sottocomponente che ha emesso la riga di registro. Stringa definita dall'utente
codeengine.instanceId Nome del pod (per applicazioni, lavori e build) o ID dell'istanza del contenitore (per funzioni e flotte). my-app-0001-pod-abcde
label.Namespace Obsoleto. Il nome del sottodominio del progetto Code Engine. Utilizzare invece codeengine.projectSubdomain. Questo campo sarà rimosso dopo il 15 giugno 2026. edf5a781
label.Project Obsoleto. Il nome del progetto Code Engine. Utilizzare invece codeengine.project. Questo campo sarà rimosso dopo il 15 giugno 2026. Stringa definita dall'utente
label.Stream Obsoleto. Il flusso di uscita che ha ricevuto il record di registro. Utilizzare invece stream. Questo campo sarà rimosso dopo il 15 giugno 2026. Valori possibili: stdout o stderr
level Facoltativo. Definisce la gravità del messaggio di log. Questo valore viene impostato solo se il livello di log può essere estratto da un messaggio di log non strutturato. I valori non tengono conto delle maiuscole e delle minuscole. Valori possibili: fatal, error, warn, info, debug, trace
logtag Obsoleto. Facoltativo. Indica se la riga di registro ricevuta è una riga di registro parziale o completa. Questo campo non è impostato per i carichi di lavoro funzionali. Questo campo sarà rimosso dopo il 15 giugno 2026 senza alcuna sostituzione. Valori possibili: F o P
message.message Il messaggio di log leggibile dall'uomo. Stringa definita dal componente di sistema o dall'utente
message.logSourceCRN Il CRN del progetto Code Engine. <code engine project CRN>
message.saveServiceCopy Obsoleto. Definisce se la riga di registro della piattaforma deve essere copiata anche nei registri di sistema di IBM Cloud® Code Engine. Questo campo sarà rimosso dopo il 15 giugno 2026 senza alcuna sostituzione. false
message.serviceName Obsoleto. Il nome del servizio IBM Cloud che ha emesso la riga di log. Utilizzare invece app. Questo campo sarà rimosso dopo il 15 giugno 2026. codeengine
message._app Obsoleto. Il nome dell'istanza (per applicazioni, lavori e build) o del componente (per le funzioni). Utilizzare invece codeengine.instanceId, codeengine.component, o entrambi. Questo campo sarà rimosso dopo il 15 giugno 2026. my-app-0001-pod-abcde
message.* Facoltativo. Meta informazioni utili all'utente per creare dashboard o avvisi. durationSeconds

Visualizzazione dei log dalla console

Quando si lavora con le applicazioni, i lavori, le funzioni o le build di Code Engine nella console con il logging abilitato, i log vengono inoltrati a un servizio IBM Cloud Logs dove vengono indicizzati, consentendo la ricerca full-text di tutti i messaggi generati e una comoda interrogazione basata su campi specifici.

L'istanza IBM Cloud Logs che riceve i log della piattaforma non deve necessariamente trovarsi nella stessa regione del progetto Code Engine e non è necessario creare questa istanza prima di lavorare con il componente Code Engine. È possibile aggiungere funzionalità di registrazione in qualsiasi momento dall'applicazione, dal lavoro, dalla funzione o dalla pagina di build della console Code Engine.

Per generare registri per qualsiasi servizio della piattaforma, è sufficiente abilitare la registrazione una sola volta per regione e per account.

Considerazioni sulla visualizzazione dei log dalla console

Quando si desidera utilizzare la registrazione dalla console, è necessario prima configurare i registri della piattaforma IBM Cloud Logs per ricevere i dati di registrazione Code Engine con IBM Cloud Logs Routing. Per controllare le istanze attive di IBM Cloud Logs, vedere il dashboard Observability.

Rivedere le informazioni del piano di servizio IBM Cloud Logs per valutare le esigenze di conservazione, ricerca e analisi dei registri.

Quando si visualizzano i dati di log per le applicazioni di Code Engine, per le esecuzioni del lavoro o per le esecuzioni della build, possono verificarsi dei ritardi prima che i dati siano disponibili in IBM Cloud Logs. Ad esempio, potrebbero essere necessari dai 5 ai 10 minuti per visualizzare i dati di log in IBM Cloud Logs, soprattutto se si utilizza la pipeline di dati Store and search.

Consultate la documentazione su Data Pipelines per conoscere le opzioni per bilanciare la latenza dei log e i costi delle istanze IBM Cloud Logs.

Quando si utilizza la registrazione con la CLI, non è necessario configurare i log della piattaforma IBM Cloud Logs, poiché la registrazione della CLI Code Engine recupera i dati in modo diverso.

Le funzionalità di registrazione offerte dalla CLI sono limitate e devono essere considerate solo a scopo di sviluppo. Quando si eseguono carichi di lavoro di produzione, utilizzare sempre un'istanza IBM Cloud Logs, che offre funzionalità di conservazione, filtro e ricerca dei registri.

È possibile applicare filtri ai dati di IBM Cloud Logs?

In base alle proprie esigenze, dalla pagina IBM Cloud Logs è possibile modificare e applicare il filtro per visualizzare i dati di log a un livello specifico o a un livello più granulare per una revisione specifica dell'applicazione, un'esecuzione di lavoro o un'esecuzione di build.

  • Se è impostato app:"codeengine", vengono visualizzati solo i registri Code Engine.

  • Se è impostato codeengine.project:'<project_name>', vengono visualizzati solo i registri di un progetto specifico.

  • Se codeengine.component:'<your_component_name>' è impostato, vengono visualizzati solo i log del componente specificato (applicazione, lavoro o build). Se i componenti di Code Engine hanno lo stesso nome, il filtro include i log di questi componenti. Ad esempio,

    • Il filtro app:"codeengine" AND codeengine.component:"myapp" individua i registri a livello di applicazione myapp.
    • Il filtro app:"codeengine" AND codeengine.subcomponent:"myapp\-00002" individua i registri al livello di revisione dell'applicazione myapp-0002.
    • Il filtro app:"codeengine" AND codeengine.component:"myjob" consente di individuare i registri al livello di lavoro specifico di myjob.
    • Il filtro app:"codeengine" AND codeengine.subcomponent:"myjob\-jobrun\-t6m7l" consente di individuare i registri in base al livello di esecuzione del lavoro specifico myjob-jobrun-t6m7l.
    • Il filtro app:"codeengine" AND codeengine.component:"mybuild" individua i registri in base al livello di compilazione specifico di mybuild.
    • Il filtro app:"codeengine" AND codeengine.subcomponent:"mybuild\-run\-121212" individua i registri al livello di esecuzione specifico della build mybuild-run-121212.

Per ulteriori informazioni sulla configurazione e l'avvio della registrazione nella console, vedere Visualizzazione dei registri di app, lavori o funzioni dalla console.

Visualizzazione dei log di app, lavori o funzioni dalla console

È possibile visualizzare i registri per le applicazioni, i lavori o le funzioni. I passaggi per visualizzare uno qualsiasi di questi dalla console sono molto simili.

Dopo aver selezionato il progetto con cui si desidera lavorare, è possibile aggiungere le funzionalità di registrazione dalla pagina Panoramica di Code Engine o da una delle sue pagine secondarie, come la pagina Applicazioni, lavori o funzioni; oppure dalla pagina specifica per l'applicazione, il lavoro o la funzione. I passi seguenti presuppongono che si stia lavorando da una pagina specifica di Code Engine.

  1. Andate a un'applicazione, un lavoro o una funzione che avete creato e distribuito. Dalla pagina Progetti della console Code Engine, selezionare il progetto e poi selezionare Applicazioni, Lavori o Funzioni, a seconda dei casi. Selezionare l'applicazione, il lavoro o la funzione con cui si desidera lavorare.
  2. Se è stata precedentemente creata un'istanza di IBM Cloud Logs, fare clic su Registrazione per aprire il servizio IBM Cloud Logs.
  3. Per aggiungere e configurare le funzionalità di registrazione, completare i seguenti passaggi:
    1. Dal menu delle opzioni Test application, Submit job o Test function, fare clic su Add logging per creare l'istanza IBM Cloud Logs. Questa azione apre il servizio IBM Cloud Logs.
    2. Dal servizio IBM Cloud Logs, creare l'istanza di logging. Per confermare che l'istanza di logging è stata creata, controllare la dashboard di Observability.
    3. Dalla pagina dell'applicazione, del lavoro o della funzione di Code Engine, fate clic su Aggiungi registrazione dal menu delle opzioni dell'applicazione di prova, del lavoro di invio o della funzione di prova. Questa volta, selezionare un'istanza di IBM Cloud Logs per ricevere i log della piattaforma. Scegliere l'istanza di registrazione creata nel passaggio precedente. Fare clic su Seleziona. Code Engine richiede i registri della piattaforma abilitati per ricevere i dati di registrazione di Code Engine. Quando si completa questa azione, Code Engine abilita la registrazione della piattaforma per l'utente.
  4. Ora che i registri della piattaforma sono configurati, dalla pagina dell'applicazione, del lavoro o della funzione di Code Engine, fare clic su Registrazione dal menu delle opzioni Test application, Submit job o Test function per aprire la finestra dei registri della piattaforma. Per confermare che i registri della piattaforma sono impostati per la propria regione, controllare la dashboard di Observability.
  5. (opzionale) Se necessario, affinare il filtro per la ricerca.
  6. Verificate la configurazione completando uno dei seguenti passaggi:
    • Per testare un'applicazione o una funzione: fare clic su Test applicazione o Test funzione, a seconda dei casi, e quindi su Invia richiesta. Per aprire l'applicazione o la funzione in una pagina web, fare clic sull'applicazione URL o sulla funzione URL. È possibile visualizzare i registri della piattaforma dal test nella finestra dei registri della piattaforma.
    • Per un lavoro, eseguirlo: dall'area Esegui lavoro, fare clic su Invia lavoro per eseguire il lavoro. Fornire i valori di configurazione dell'esecuzione del lavoro o utilizzare i valori predefiniti. Fare clic su Invia lavoro per eseguire il lavoro. È possibile visualizzare i registri della piattaforma dall'esecuzione del lavoro nella finestra dei registri della piattaforma.

L'istanza di IBM Cloud Logs è ora configurata in modo da poter ricevere il logging della piattaforma per l'applicazione, il lavoro o la funzione Code Engine.

In alternativa, è possibile configurare un'istanza di IBM Cloud Logs utilizzando la dashboard di Observability per creare l'istanza e poi configurando il routing dei registri della piattaforma.

Visualizzazione dei log di compilazione dalla console

È possibile visualizzare i registri per istanze specifiche di esecuzione della build dalla console.

  1. Vai al dashboard Code Engine.
  2. Selezionare un progetto o crearne uno.
  3. Dalla pagina del progetto, fare clic su Costruzioni di immagini.
  4. Dalla scheda Creazione immagine, fare clic sul nome della creazione dell'immagine per aprire la pagina di creazione per una creazione definita o creare una creazione.
  5. Dalla pagina di compilazione per la build definita, fare clic sul nome dell'istanza dell'esecuzione della build nella sezione Esecuzioni della build. Potrebbe essere necessario fare clic su Invia build per creare un'esecuzione di build. È possibile visualizzare i registri della piattaforma dall'esecuzione della compilazione nella finestra dei registri della piattaforma. In alternativa, è possibile visualizzare le informazioni del registro di compilazione per i dettagli della fase di compilazione dalla pagina dell'istanza di esecuzione della compilazione. Espandere le fasi di compilazione per ottenere i dati di log delle fasi di compilazione specifiche. Se necessario, è possibile affinare il filtro per la ricerca.

Visualizzazione dei log con la CLI

Per visualizzare l'output di registrazione con la CLI, è necessario avere un'istanza in esecuzione dell'applicazione o del lavoro. Se un'applicazione viene scalata a zero o un'istanza di esecuzione del lavoro viene completata, l'output per i parametri ibmcloud ce app logs e ibmcloud ce jobrun logs non contiene dati di log. In alternativa, è possibile utilizzare il servizio IBM Cloud Logs per visualizzare i dati di log.

Visualizzazione dei log delle applicazioni con la CLI

Per visualizzare i registri delle applicazioni per un'applicazione specifica con la CLI, utilizzare il comando application logs. È possibile visualizzare i registri di tutte le istanze di un'applicazione o visualizzare i registri di un'istanza specifica di un'applicazione. Il comando app get visualizza i dettagli dell'applicazione, comprese le istanze in esecuzione dell'applicazione.

  • Per visualizzare i registri di tutte le istanze dell'applicazione myapp, specificare il nome dell'applicazione con l'opzione --app. Ad esempio:

    ibmcloud ce app logs --app myapp
    

    Output di esempio

    Getting logs for all instances of application 'myapp'...
    OK
    
    myapp-ii18y-2-deployment-7657c5f4f9-dgk5f:
    Server running at http://0.0.0.0:8080/
    
  • Per visualizzare i registri di un'istanza specifica dell'applicazione, specificare il nome dell'istanza specifica dell'applicazione con l'opzione --instance. Ad esempio:

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

    Output di esempio

    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/
    

Visualizzazione dei log dei lavori con la CLI

Per visualizzare i registri di un lavoro specifico eseguito con la CLI, utilizzare il comando jobrun logs. È possibile visualizzare i registri di tutte le istanze di un lavoro eseguito o visualizzare i registri di un'istanza specifica di un lavoro eseguito. Il comando jobrun get visualizza i dettagli dell'esecuzione del lavoro, comprese le istanze dell'esecuzione del lavoro.

  • Per visualizzare i registri di tutte le istanze dell'esecuzione del lavoro testjobrun, specificare il nome dell'esecuzione del lavoro con l'opzione --jobrun. Ad esempio:

    ibmcloud ce jobrun logs --jobrun testjobrun
    

    Output di esempio

    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!
    
  • Per visualizzare i registri dell'istanza di esecuzione del lavoro testjobrun-1-0, specificare il nome di un'istanza specifica dell'esecuzione del lavoro con l'opzione --instance. Ad esempio:

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

    Output di esempio

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

Visualizzazione dei log di compilazione con la CLI

Per visualizzare i registri di compilazione di un'esecuzione specifica con la CLI, usare il comando buildrun logs. È possibile visualizzare i registri di tutte le istanze di un'esecuzione di creazione in base al nome dell'esecuzione di creazione.

Per visualizzare i registri di tutte le istanze dell'esecuzione di compilazione mybuildrun, specificare il nome dell'esecuzione di compilazione con l'opzione --name. Ad esempio:

ibmcloud ce buildrun logs --name mybuildrun

Output di esempio

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