Écrire et consulter les journaux des applications, des tâches et des fonctions
La journalisation peut vous aider à identifier et résoudre les incidents dans IBM Cloud® Code Engine. Vous pouvez consulter les journaux à l'aide de la console ou de l'interface de ligne de commande.
Intéressé par l'enregistrement pour les flottes? Voir Configuration de l'observabilité pour les flottes et Consultation des journaux et des données de surveillance pour les flottes.
Journal de bord
Apprenez à écrire des journaux de manière efficace sur IBM Cloud® Code Engine, y compris les meilleures pratiques pour les formats de journaux, les niveaux de gravité, les horodatages et la gestion des entrées multilignes pour les journaux non structurés et structurés.
Considérations relatives à la rédaction des journaux
Écriture des journaux sur la sortie standard et sur l'erreur
Dans Code Engine, les enregistrements de journaux émis par votre charge de travail ne sont collectés que lorsqu'ils sont écrits sur stdout ou stderr, conformément aux lignes directrices de l'application Twelve-Factor
qui recommandent de traiter les journaux comme des flux d'événements plutôt que de gérer des fichiers journaux. Voir Création d'applications cloud-natives : applications à 12 facteurs - Facteur 11 - Logs.
Le pipeline de journalisation de la plateforme capture et traite automatiquement cette sortie, la rendant disponible pour l'analyse et le dépannage. Les lignes de journal écrites dans les fichiers du système de fichiers éphémère du conteneur ne sont pas ingérées, persistées ou exposées par l'interface de journalisation. Par conséquent, les journaux stockés sur le système de fichiers éphémères sont perdus lorsque l'instance est redémarrée ou arrêtée et ne sont pas disponibles pour le débogage opérationnel ou l'analyse des causes profondes.
Dois-je ajouter des horodatages à mes lignes de journal?
Les enregistrements de journaux générés par les charges de travail des utilisateurs doivent éviter d'intégrer leurs propres informations d'horodatage, car l'infrastructure Code Engine capture et normalise automatiquement les horodatages. L'inclusion d'horodatages au niveau de l'application peut créer des incohérences entre les services, en particulier lorsque les charges de travail s'exécutent dans des environnements distribués ou conteneurisés où les horloges des systèmes peuvent dériver ou différer. L'utilisation des horodatages de la plateforme garantit des formats horaires uniformes, un séquençage précis et une corrélation fiable avec d'autres journaux générés par le système, ce qui simplifie le dépannage, l'audit et l'observabilité dans l'ensemble du déploiement.
Comment mes niveaux de journalisation correspondent-ils à la gravité IBM Cloud Logs?
Le niveau de journalisation indiqué dans chaque enregistrement est mis en correspondance avec les niveaux de gravité de IBM Cloud Logs, tels que décrits à l'adresse Mappage des sévérités du journal aux sévérités de IBM Cloud Logs. Dans les sections suivantes, vous apprendrez comment les niveaux de journalisation sont analysés pour les journaux non structurés et structurés et quelles sont les valeurs de niveau de journalisation prises en charge.
Que se passe-t-il si mes données d'enregistrement sont multilignes?
Pour profiter des fonctions de recherche et de formatage de IBM Cloud Logs, modifiez le formatage de votre journal comme suit.
- Si vos lignes de journal s'étendent sur plusieurs lignes, modifiez la façon dont vous formatez et produisez vos journaux afin qu'ils ne forment qu'une seule ligne. Utilisez le format JSONL (voir Formats des journaux ) pour vos journaux avec IBM Cloud Logs.
- Vos grumes doivent être conformes aux limites fixées pour IBM Cloud Logs.
formats de journal
Les données du journal peuvent être émises dans deux formats courants : non structurés et structurés.
- Les journaux non structurés sont des textes de forme libre, simples à produire et lisibles par l'homme, mais difficiles à analyser de manière cohérente pour les systèmes dorsaux. Cela limite la fiabilité du filtrage et de la corrélation.
- Les journaux structurés encodent les champs dans un schéma prévisible (par exemple, JSON), ce qui permet aux pipelines de journaux d'indexer et d'interroger des attributs tels que les identifiants de demande, les identifiants d'utilisateur ou les métadonnées spécifiques à un domaine. Code Engine prend en charge JSON pour les journaux structurés, ce qui permet de garantir que vos champs personnalisés restent lisibles par la machine et facilement filtrables dans les outils d'observabilité.
Si vous envisagez d'enrichir les lignes de journal avec des informations personnalisées et filtrables, utilisez la journalisation structurée.
Journaux non structurés
Exemples
Vous trouverez ci-dessous des exemples simples qui écrivent une ligne de journal non structurée (texte libre) sur la sortie standard.
Les exemples sont publiés dans le dépôt d'échantillons public Code Engine à l'adresse 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");
}
}
Détection du niveau de journalisation
Chaque enregistrement est analysé à la recherche de mots-clés afin de déterminer le degré de gravité. Les valeurs de gravité, qui sont évaluées de manière insensible à la casse, sont critical, error, warn,
info, debug, et verbose.
Si une ligne de journal commence par un mot-clé de gravité au format LEVEL MESSAGE, Code Engine supprime le niveau détecté du message de journal affiché afin que les utilisateurs puissent se concentrer sur le contenu principal
tout en continuant à filtrer précisément par gravité dans la vue IBM Cloud Logs. Dans ce cas, la valeur de gravité extraite est stockée dans le champ de l'enregistrement level. Les niveaux de gravité suivants, insensibles
à la casse, sont pris en charge : fatal, error, warn, info, debug, et trace. Par exemple, à l'adresse Node.js, vous pouvez écrire :
// Unstructured log with level prefix
console.log('ERROR Payment service timeout while creating invoice');
Dans IBM Cloud Logs, cette entrée apparaît avec la gravité Error et le texte du message "Payment service timeout while creating invoice "; vous pouvez alors filtrer par Severity = Error pour restreindre les résultats. Vous pouvez également utiliser des règles d'analyse et de gravité pour adapter la manière dont les niveaux sont extraits et mis en correspondance à votre environnement.
La détection du niveau de journalisation fonctionne également lorsque les lignes de journalisation suivent des formats légèrement différents, tels que LEVEL: MESSAGE ou [LEVEL] MESSAGE. Toutefois, dans ces cas,
le mot-clé level est supprimé du message d'enregistrement ( pas ), même si la gravité est toujours correctement classée.
En outre, la logique de détection peut déduire un niveau de gravité lorsqu'un mot-clé pris en charge apparaît n'importe où dans le message, et pas seulement au début. Par exemple, la ligne de journal :
The payment workflow encountered an unexpected error during validation
Cette ligne de journal est classée dans la catégorie " Erreur " parce que le mot " erreur" apparaît dans le texte du message.
La détection du niveau de journalisation ne prend pas en compte le flux d'entrée (stdout ou stderr) pour la détection du niveau de journalisation. Par conséquent, les messages écrits sur l'erreur standard (stderr)
sont évalués uniquement sur la base du texte du message. Par exemple, console.error("Some message") est classé comme Info, bien qu'il soit écrit sur stderr.
Pour les charges de travail fonctionnelles, le niveau du journal n'est pas supprimé du message affiché, même s'il est détecté au début de la ligne de journal dans le format LEVEL MESSAGE.
Analyse et évaluation de l'horodatage
L'ajout d'un horodatage aux lignes des journaux d'application est non recommandé car Code Engine attribue automatiquement un horodatage normalisé lors de l'ingestion des journaux. Si un horodatage est inclus au début d' une ligne de journal, le système tente de l'analyser. S'il correspond à l'un des formats pris en charge, l'horodatage est supprimé du message d'enregistrement affiché, de la même manière que les niveaux d'enregistrement sont gérés. Les formats d'horodatage pris en charge sont les suivants
2026-02-08T20:30:45.1232026-02-08T20:30:45.123Z2026-02-08T21:03:45.123456Z2026-02-08T21:03:45.123456789Z2026-02-08 21:03:45.123Z2026-02-08 20:30:45.123
Lorsqu'une ligne de journal contient à la fois un horodatage et un niveau de journal au début (par exemple, TIMESTAMP LEVEL MESSAGE), le pipeline évalue les deux champs. Si les deux correspondent aux modèles
pris en charge, ils sont classés de manière appropriée et supprimés du message rendu, ne laissant que le corps du message pour faciliter la lecture et le filtrage. Par exemple, les formats suivants sont analysés avec succès
:
2026-02-08T21:03:45.123456789Z ERROR Payment service timeout2026-02-08 20:30:45.123 INFO Starting billing workflow
Dans les cas où un horodatage apparaît mais ne correspond pas aux formats pris en charge, il reste dans la ligne de journal et est traité comme du texte normal, mais le reste du message est toujours traité normalement.
Pour les charges de travail fonctionnelles, les horodatages ne sont pas analysés, évalués ou supprimés des messages du journal. Tout horodatage inclus dans les journaux de fonctions reste dans le message affiché.
Support multiligne
Code Engine prend en charge les entrées de journal sur plusieurs lignes. Cependant, lorsque vous émettez des journaux, vous devez vous assurer que les caractères de nouvelle ligne (\n) sont correctement encodés (\\n) afin que le pipeline de journalisation puisse traiter et rendre correctement les messages multi-lignes. Par exemple, à l'adresse Node.js, vous pouvez produire une entrée de journal multi-lignes comme celle-ci :
console.log("Starting billing workflow...\\nStep 1: Validating input...\\nStep 2: Processing payment...");
Enregistrement des erreurs
Si votre charge de travail émet des traces d'erreur sur plusieurs lignes, utilisez le format de journal JSON structuré au lieu de la sortie console non structurée. Les journaux structurés préservent les champs multilignes de manière fiable et garantissent que les traces de pile sont regroupées dans un seul enregistrement, ce qui est abordé dans la section Journaux structurés.
Par exemple, le message suivant est classé dans la catégorie Erreur car le mot-clé "error" apparaît dans le message. Cependant, la trace de la pile fournie par l'objet err est présentée
sous la forme de plusieurs lignes de journal.
try {
throw new Error("boom!");
} catch (err) {
console.error("An error occurred", err);
}
Journaux structurés
Exemples
Voici exemples d'enregistrements structurés minimaux pour chaque langue et exécution qui émet un seul JSON avec le journal niveau dans le champ level et le journal message dans
le champ message.
Les exemples sont publiés dans le dépôt d'échantillons public Code Engine à l'adresse 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 et Logback avec 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");
}
}
Détection du niveau de journalisation
Chaque enregistrement est analysé à la recherche de mots-clés afin de déterminer le degré de gravité. Les valeurs de gravité, qui sont évaluées de manière insensible à la casse, sont critical, error, warn,
info, debug, et verbose.
Lorsque vous utilisez des journaux structurés, Code Engine détecte automatiquement le niveau du journal lorsqu'il est indiqué dans l'un des champs suivants : level, severity, ou logLevel. La valeur
de ces champs n'est pas sensible à la casse, ce qui signifie que des entrées telles que error, ERROR ou Error correspondent toutes à la même gravité. Les niveaux de gravité suivants, insensibles à
la casse, sont pris en charge : critical, error, warn, info, debug, et verbose. Lorsqu'un champ pris en charge est présent et contient l'une de ces valeurs,
le niveau du journal est extrait, normalisé et utilisé pour le filtrage et la catégorisation dans l'interface utilisateur des journaux. Par exemple, les lignes de journal structurées suivantes sont toutes correctement interprétées avec
le niveau Erreur:
{ "level": "error", "message": "Payment service timeout" }
{ "severity": "ERROR", "message": "Failed to connect to database" }
{ "logLevel": "eRrOr", "message": "Workflow aborted" }
Indépendamment de la capitalisation ou de la valeur spécifique du champ utilisé, la plateforme identifie correctement le niveau du journal et l'applique pour le filtrage, le regroupement et l'analyse de vos données de journal structurées.
Évaluation de l'horodatage
Pour les journaux structurés, les horodatages personnalisés ne sont pas analysés ou évalués. Tout champ d'horodatage que vous fournissez est traité purement comme des données utiles, tandis que la plateforme applique toujours son propre horodatage d'ingestion pour l'ordonnancement et le filtrage.
Dans l'exemple ci-dessous, la valeur "timestamp" est conservée mais ignorée pour la synchronisation du journal.
{ "level": "INFO", "message": "Processing started", "timestamp": "2026-02-08T20:30:45.123Z" }
Ajout d'informations contextuelles supplémentaires
Vous pouvez enrichir les journaux structurés avec des champs personnalisés (par exemple, requestId, userId, ou des métadonnées spécifiques à un domaine). Les exemples suivants sont des exemples minimaux pour chaque
pile utilisée précédemment.
Les champs personnalisés doivent être concis et stables (par exemple, des identifiants, des codes ou de petites listes) afin de maximiser les possibilités de filtrage et de minimiser la cardinalité dans votre instance de journalisation.
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 et Logback avec logstash-logback-encoder )
logger.atDebug().addKeyValue("extra_key", "extra_value")
.log("A structured log entry that contains an extra key");
Enregistrement des erreurs
Pour capturer à la fois le message d'erreur et sa trace de pile dans des journaux structurés, émettez un enregistrement JSON qui comprend vos champs standard (level, message) plus
un champ stack (ou similaire).
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 et Logback avec 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");
}
Les charges de travail fonctionnelles gèrent des journaux multilignes, mais chaque caractère de retour à la ligne donne lieu à une entrée de journal distincte. Lorsque vous enregistrez des traces de pile avec des structures d'enregistrement structurées, vous pouvez avoir besoin d'échapper manuellement les caractères de nouvelle ligne pour vous assurer qu'ils sont rendus correctement comme une entrée d'enregistrement unique.
Champs d'enregistrement
| Nom de zone | Description | Exemple de valeur |
|---|---|---|
app |
Le service IBM Cloud qui a émis la ligne de journal de la plate-forme. Pour Code Engine, il s'agira toujours de codeengine. |
codeengine |
tag |
Champ défini par fluentbit et dérivé de l'ID d'entrée défini dans la configuration de fluentbit. | platform.<id>.codeengine |
stream |
Le flux de sortie qui a reçu l'enregistrement. | Valeurs possibles : stdout ou stderr |
originator |
Indique si un composant du système Code Engine ou une charge de travail utilisateur a émis la ligne de journal. | system ou user |
resourceGroupId |
Groupe de ressources CRN pour le projet Code Engine. | <resource group CRN> |
messageKey |
Identifiant unique facultatif, lisible par l'homme, pour le filtrage des journaux et le dépannage. | Chaîne définie par l'utilisateur |
codeengine.region |
Région du projet Code Engine. | us-south |
codeengine.project |
Nom du projet Code Engine. | Chaîne définie par l'utilisateur |
codeengine.projectGuid |
GUID du projet Code Engine. | <project GUID> |
codeengine.projectSubdomain |
Espace de noms du projet Code Engine. | edf5a781 |
codeengine.componentType |
Type de composant qui a émis la ligne de journal. | Valeurs possibles : app, job, job_run, fleet, function, build, build_run, container |
codeengine.component |
Nom du composant qui a émis la ligne de journal. | Chaîne définie par l'utilisateur |
codeengine.subcomponentType |
Type de sous-composant qui a émis la ligne de journal. | Valeurs possibles : app_revision, job_run, fleet_instance, function, build_run, container |
codeengine.subcomponent |
Nom du sous-composant qui a émis la ligne de journal. | Chaîne définie par l'utilisateur |
codeengine.instanceId |
Nom du pod (pour les applications, les travaux et les constructions) ou ID de l'instance de conteneur (pour les fonctions et les flottes). | my-app-0001-pod-abcde |
label.Namespace |
Obsolète. Le nom du sous-domaine du projet Code Engine. Utilisez plutôt codeengine.projectSubdomain. Ce champ sera supprimé après le 15 juin 2026. |
edf5a781 |
label.Project |
Obsolète. Le nom du projet Code Engine. Utilisez plutôt codeengine.project. Ce champ sera supprimé après le 15 juin 2026. |
Chaîne définie par l'utilisateur |
label.Stream |
Obsolète. Le flux de sortie qui a reçu l'enregistrement. Utilisez plutôt stream. Ce champ sera supprimé après le 15 juin 2026. |
Valeurs possibles : stdout ou stderr |
level |
Optionnel. Définit la gravité du message de journal. Cette valeur n'est définie que si le niveau du journal peut être extrait d'un message non structuré. Les valeurs sont insensibles à la casse. | Valeurs possibles : fatal, error, warn, info, debug, trace |
logtag |
Obsolète. Optionnel. Indique si la ligne de journal reçue est une ligne de journal partielle ou complète. Ce champ n'est pas défini pour les charges de travail fonctionnelles. Ce champ sera supprimé après le 15 juin 2026 et ne sera pas remplacé. | Valeurs possibles : F ou P |
message.message |
Le message du journal lisible par l'homme. | Chaîne définie par un composant du système ou par l'utilisateur |
message.logSourceCRN |
Le CRN du projet Code Engine. | <code engine project CRN> |
message.saveServiceCopy |
Obsolète. Définit si la ligne de journal de la plate-forme doit également être copiée dans les journaux système de IBM Cloud® Code Engine. Ce champ sera supprimé après le 15 juin 2026 et ne sera pas remplacé. | false |
message.serviceName |
Obsolète. Le nom du service IBM Cloud qui a émis cette ligne de journal. Utilisez plutôt app. Ce champ sera supprimé après le 15 juin 2026. |
codeengine |
message._app |
Obsolète. Le nom de l'instance (pour les applications, les jobs et les builds) ou le nom du composant (pour les fonctions). Utilisez codeengine.instanceId, codeengine.component, ou les deux
à la place. Ce champ sera supprimé après le 15 juin 2026. |
my-app-0001-pod-abcde |
message.* |
Optionnel. Méta-informations utiles à l'utilisateur pour créer des tableaux de bord ou des alertes. | durationSeconds |
Affichage des journaux à partir de la console
Lorsque vous travaillez avec Code Engine apps, jobs, fonctions ou builds dans la console avec la journalisation activée, les logs sont transmis à un service IBM Cloud Logs où ils sont indexés, permettant une recherche plein texte dans tous les messages générés et des requêtes pratiques basées sur des champs spécifiques.
L'instance IBM Cloud Logs qui reçoit les journaux de plate-forme ne doit pas nécessairement se trouver dans la même région que votre projet Code Engine, et vous n'êtes pas obligé de créer cette instance avant de travailler avec votre composant Code Engine. Vous pouvez ajouter des capacités de journalisation à tout moment depuis votre application Code Engine, votre travail, votre fonction ou votre page de construction dans la console.
Pour générer des journaux pour n'importe quel service de la plate-forme, il suffit d'activer la journalisation une fois par région et par compte.
Considérations relatives à l'affichage des journaux à partir de la console
Lorsque vous souhaitez utiliser la journalisation à partir de la console, vous devez d'abord configurer les journaux de la plate-forme IBM Cloud Logs pour qu'ils reçoivent les données de journalisation de Code Engine à l'aide de IBM Cloud Logs Routing. Pour vérifier si des instances IBM Cloud Logs sont actives, consultez le tableau de bord Observability.
Consultez les informations sur le plan de service IBM Cloud Logs lorsque vous envisagez les besoins en matière de conservation, de recherche et d'analyse des journaux.
Lorsque vous consultez des données de journal pour des applications Code Engine, des exécutions de votre travail ou des exécutions de votre compilation, des délais peuvent s'écouler avant que les données ne soient disponibles sur IBM Cloud
Logs. Par exemple, il peut s'écouler 5 à 10 minutes avant que les données de votre journal ne s'affichent sur IBM Cloud Logs, surtout si vous utilisez le pipeline de données Store and search.
Consultez la documentation sur les pipelines de données pour découvrir les options permettant d'équilibrer la latence et le coût des journaux pour vos instances IBM Cloud Logs.
Lorsque vous utilisez la journalisation avec la CLI, vous n'avez pas besoin de configurer les journaux de la plateforme IBM Cloud Logs, car la journalisation de la CLI Code Engine récupère ses données différemment.
Les capacités de journalisation offertes par l'interface de programmation sont limitées et ne doivent être utilisées qu'à des fins de développement. Lorsque vous exécutez des charges de travail de production, utilisez toujours une instance IBM Cloud Logs, qui offre des fonctionnalités de rétention, de filtrage et de recherche des journaux.
Puis-je appliquer des filtres aux données de IBM Cloud Logs?
Vous pouvez modifier et étendre le filtre pour afficher les données de journal à un niveau spécifique ou à un niveau plus granulaire pour une révision d'application spécifique, une exécution de travail ou une exécution de construction à partir de la page IBM Cloud Logs, en fonction de vos besoins.
-
Si l'option
app:"codeengine"est activée, seuls les journaux Code Engine sont affichés. -
Si l'option
codeengine.project:'<project_name>'est activée, seuls les journaux d'un projet spécifique sont affichés. -
Si
codeengine.component:'<your_component_name>'est défini, seuls les journaux du composant spécifié (application, job ou build) sont affichés. Si vos composants Code Engine portent le même nom, le filtre inclut les journaux de ces composants. Par exemple :- Le filtre
app:"codeengine" AND codeengine.component:"myapp"limite les journaux au niveau de l'applicationmyapp. - Le filtre
app:"codeengine" AND codeengine.subcomponent:"myapp\-00002"limite les journaux au niveau de révision de l'applicationmyapp-0002. - Le filtre
app:"codeengine" AND codeengine.component:"myjob"permet de limiter les journaux au niveau de travail spécifique demyjob. - Le filtre
app:"codeengine" AND codeengine.subcomponent:"myjob\-jobrun\-t6m7l"permet de limiter les journaux au niveau d'exécution spécifique de la tâchemyjob-jobrun-t6m7l. - Le filtre
app:"codeengine" AND codeengine.component:"mybuild"permet de limiter les journaux au niveau de construction spécifique demybuild. - Le filtre
app:"codeengine" AND codeengine.subcomponent:"mybuild\-run\-121212"permet de limiter les journaux au niveau d'exécution spécifique demybuild-run-121212.
- Le filtre
Pour plus d'informations sur la configuration et le démarrage de la journalisation dans la console, voir Afficher les journaux d'applications, de tâches ou de fonctions à partir de la console.
Consulter les journaux d'applications, de tâches ou de fonctions à partir de la console
Vous pouvez consulter les journaux pour les applications, les tâches ou les fonctions. Les étapes à suivre pour visualiser l'un ou l'autre de ces éléments à partir de la console sont très similaires.
Après avoir sélectionné le projet avec lequel vous souhaitez travailler, vous pouvez ajouter des fonctionnalités de journalisation à partir de la page Code Engine Overview ou de l'une de ses pages subordonnées, telles que la page Applications, Jobs ou Functions, ou encore à partir de la page spécifique à votre application, job ou fonction. Les étapes suivantes supposent que vous travaillez à partir d'une page Code Engine spécifique.
- Accédez à une application, un travail ou une fonction que vous avez créé et déployé. Dans la page Projets de la console Code Engine, sélectionnez votre projet, puis sélectionnez Applications, Jobs ou Fonctions selon le cas. Sélectionnez l'application, le travail ou la fonction avec laquelle vous souhaitez travailler.
- Si vous avez déjà créé une instance IBM Cloud Logs, cliquez sur Logging pour ouvrir le service IBM Cloud Logs.
- Pour ajouter et configurer des fonctionnalités de journalisation, procédez comme suit :
- Dans le menu d'options Test application, Submit job ou Test function, cliquez sur Add logging pour créer l'instance IBM Cloud Logs. Cette action ouvre le service IBM Cloud Logs.
- A partir du service IBM Cloud Logs, créez votre instance de journalisation. Pour vérifier que votre instance de journalisation a été créée, consultez le tableau de bord d'observabilité.
- Sur la page de l'application, du travail ou de la fonction Code Engine, cliquez sur Ajouter la journalisation dans le menu d'options Tester l'application, Soumettre le travail ou Tester la fonction. Cette fois, sélectionnez une instance IBM Cloud Logs pour recevoir les journaux de la plate-forme. Sélectionnez l'instance de journalisation que vous avez créée à l'étape précédente. Cliquez sur Sélectionner. Code Engine nécessite que les journaux de la plate-forme soient activés pour recevoir les données de journalisation de Code Engine. Lorsque vous effectuez cette action, Code Engine active l'enregistrement de la plate-forme pour vous.
- Maintenant que les journaux de la plate-forme sont configurés, à partir de la page de l'application, du travail ou de la fonction Code Engine, cliquez sur Logging dans le menu d'options Test application, Submit job ou Test function pour ouvrir la fenêtre des journaux de la plate-forme. Pour vérifier que les journaux de plateforme sont définis pour votre région, consultez le tableau de bord d'observabilité.
- (facultatif) Affinez le filtre pour votre recherche, si nécessaire.
- Vérifiez votre configuration en effectuant l'une des étapes suivantes :
- Pour une application ou une fonction, testez-la : cliquez sur Tester l'application ou Tester la fonction, selon le cas, puis cliquez sur Envoyer la demande. Pour ouvrir l'application ou la fonction dans une page web, cliquez sur Application URL ou Fonction URL. Vous pouvez consulter les journaux de la plate-forme à partir du test dans la fenêtre des journaux de la plate-forme.
- Pour un travail, exécutez-le : dans la zone Exécution du travail, cliquez sur Soumettre le travail pour l'exécuter. Spécifiez les valeurs de configuration de l'exécution de travail ou utilisez les valeurs par défaut. Cliquez sur Soumettre un travail pour exécuter votre travail. Vous pouvez consulter les journaux de la plate-forme depuis l'exécution du travail dans la fenêtre des journaux de la plate-forme.
Votre instance IBM Cloud Logs est maintenant configurée de manière à pouvoir recevoir les enregistrements de la plateforme pour votre application, votre travail ou votre fonction Code Engine.
Vous pouvez également configurer une instance IBM Cloud Logs en utilisant le tableau de bord Observability pour créer l'instance, puis en configurant le routage des journaux de la plate-forme.
Affichage des journaux de génération à partir de la console
Vous pouvez afficher les journaux d'instances d'exécution de génération spécifiques à partir de la console.
- Accédez au tableau de bord Code Engine.
- Sélectionnez un projet ou créez-en un.
- Sur la page du projet, cliquez sur Générations d'image.
- Dans l'onglet Construction de l'image, cliquez sur le nom de votre construction d'image pour ouvrir la page de construction d'une construction définie, ou créez une construction.
- A partir de la page de la génération définie, cliquez sur le nom de l'instance de l'exécution de génération dans la section Exécutions de génération. Vous pourriez être amené à cliquer sur Soumettre une génération pour créer une exécution de génération. Vous pouvez consulter les journaux de la plate-forme à partir de l'exécution de la construction dans la fenêtre des journaux de la plate-forme. Vous pouvez également consulter les informations du journal de construction pour les détails de l'étape de construction à partir de la page de l'instance d'exécution de la construction. Développez les étapes de construction pour obtenir des données d'enregistrement spécifiques à l'étape de construction. Vous pouvez éventuellement affiner le filtre pour votre recherche, si nécessaire.
Affichage des journaux via l'interface de ligne de commande
Pour afficher la sortie de la journalisation avec l'interface de commande, vous devez avoir une instance en cours d'exécution de votre application ou de votre tâche. Si une application est mise à l'échelle à zéro ou si une instance d'exécution
de travail est terminée, la sortie des champs ibmcloud ce app logs et ibmcloud ce jobrun logs ne contient pas de données de journal. Vous pouvez également utiliser le service IBM
Cloud Logs pour consulter les données du journal.
Affichage des journaux d'application via l'interface de ligne de commande
Pour afficher les journaux d'application d'une application spécifique avec l'interface de ligne de commande, utilisez la commande application logs. Vous pouvez afficher les journaux de toutes les instances d'une application ou
afficher les journaux d'une instance spécifique d'une application. La commande app get vous permet d'afficher les détails relatifs à votre application, y compris les instances en cours de celle-ci.
-
Pour afficher les journaux de toutes les instances de l'application
myapp, spécifiez le nom de l'application avec l'option--app. Exemple :ibmcloud ce app logs --app myappExemple de sortie
Getting logs for all instances of application 'myapp'... OK myapp-ii18y-2-deployment-7657c5f4f9-dgk5f: Server running at http://0.0.0.0:8080/ -
Pour afficher les journaux d'une instance spécifique de l'application, spécifiez le nom de l'instance spécifique de l'application avec l'option
--instance. Exemple :ibmcloud ce app logs --instance myapp-ii18y-2-deployment-7657c5f4f9-dgk5fExemple de sortie
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/
Affichage des journaux de travail via l'interface de ligne de commande
Pour afficher les journaux d'une exécution de travail spécifique à l'aide de l'interface de ligne de commande, utilisez la commande jobrun logs. Vous pouvez afficher les journaux de toutes les instances d'un travail exécuté ou
afficher les journaux d'une instance spécifique d'une exécution de travail. La commande jobrun get vous permet d'afficher les détails relatifs à votre exécution de travail, y compris les instances de celle-ci.
-
Pour afficher les journaux de toutes les instances de l'exécution du travail
testjobrun, spécifiez le nom de l'exécution du travail avec l'option--jobrun. Exemple :ibmcloud ce jobrun logs --jobrun testjobrunExemple de sortie
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! -
Pour afficher les journaux de l'instance de l'exécution du travail
testjobrun-1-0, indiquez le nom d'une instance spécifique de l'exécution du travail à l'aide de l'option--instance. Exemple :ibmcloud ce jobrun logs --instance testjobrun-1-0Exemple de sortie
Getting logs for job run instance 'testjobrun-1-0'... OK testjobrun-1-0: Hello World!
Affichage des journaux de génération via l'interface de ligne de commande
Pour afficher les journaux de génération d'une exécution de génération spécifique à l'aide de l'interface de ligne de commande, utilisez la commande buildrun logs. Vous pouvez afficher les journaux de toutes les instances d'une
exécution de génération en fonction du nom de l'exécution de génération.
Pour afficher les journaux de toutes les instances de l'exécution de compilation mybuildrun, spécifiez le nom de l'exécution de compilation avec l'option --name. Exemple :
ibmcloud ce buildrun logs --name mybuildrun
Exemple de sortie
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"}