Personalizzazione di 1.6.x Agent di registrazione per supportare l'analisi multilinea personalizzata per le applicazioni Node.js che utilizzano Winston in ambienti orchestrati
Questa esercitazione mostra come configurare la gestione dei registri multilinea di IBM® Cloud Logs Agent di registrazione per un'applicazione Node.js utilizzando la libreria di registrazione Winston personalizzata. Questa configurazione è per gli ambienti orchestrati, ad esempio IBM Cloud Kubernetes Service e Red Hat OpenShift on IBM Cloud, e utilizza Helm. Questa configurazione assicura che le tracce dello stack e i log multilinea siano raggruppati correttamente in IBM Cloud Logs.
Questa esercitazione richiede il programma IBM Cloud Logs Agent di registrazione 1.6.0 o successivo.
Prima di iniziare
Prima di iniziare a utilizzare questa esercitazione, si consiglia di leggere le seguenti informazioni per comprendere i concetti di Agent di registrazione e multilinea.
Questa esercitazione presuppone anche che siate in possesso di:
-
Un'istanza di IBM Cloud Logs è stata fornita e configurata.
-
Il sito Agent di registrazione è distribuito in un ambiente orchestrato.
-
Kubernetes Service IBM Cloud Kubernetes Service
-
Red Hat OpenShift on IBM Cloud Red Hat OpenShift on IBM Cloud
-
Esempio di configurazione Winston
Supponiamo che l'applicazione Node.js utilizzi Winston e registri nella console nel seguente formato:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp({
format: 'ddd MMM DD YYYY HH:mm:ss.SSS'
}),
winston.format.errors({ stack: true }),
winston.format.printf(({ timestamp, level, message, stack }) => {
const levelUpper = level.toUpperCase();
const baseLog = `[${timestamp}] ${levelUpper} [Main] - ${message}`;
if (stack) {
return `${baseLog}\n${stack}`;
}
return baseLog;
})
),
transports: [
new winston.transports.Console()
]
});
Questo formato produce voci di registro che iniziano con un timestamp e un livello, mentre i registri multilinea, come le tracce dello stack di errori, seguono su righe successive senza timestamp.
Winston in genere registra tutto l'output, comprese le tracce di stack degli errori, come una singola stringa, quindi spesso non è necessario un parser multilinea. Tuttavia, questo esempio dimostra cosa fare se il formattatore stampa log multilinea e illustra come affrontare il parsing multilinea per qualsiasi formato personalizzato.
Questa configurazione è fornita come esempio per mostrare come gestire i registri multilinea quando si usa la formattazione personalizzata dei registri. Se l'applicazione utilizza una struttura o una libreria di log diversa, usare questo come riferimento per creare il proprio parser multilinea di conseguenza.
Configurazione dell'analisi multilinea con Helm
Se si distribuisce Agent di registrazione usando Helm, si può configurare l'analisi multilinea nel file Helm values.yaml.
Abilita l'analisi multilinea
Impostare enableMultiline su true nel file values.yaml per attivare l'elaborazione multilinea:
enableMultiline: true
Definire il parser multilinea
Aggiungere un parser multilinea personalizzato nella sezione additionalMultilineParsers del file values.yaml.
È importante che lo schema definito nel file log4j.xml sia in linea con la regex del parser multilinea per garantire un corretto raggruppamento dei registri.
additionalMultilineParsers:
- name: multiline-nodejs-winston
type: regex
flush_timeout: 500
rules:
- state: start_state
regex: '/^\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] .*$/'
next_state: cont
- state: cont
regex: '/^(?!\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] ).*$/'
next_state: cont
La regex presuppone che ogni nuova riga di log inizi con un timestamp nel formato ddd MMM DD YYYY HH:mm:ss.SSS. La prima regola cattura le righe iniziali con i timestamp e passa a uno stato di continuazione. La seconda regola corrisponde
a qualsiasi riga che non inizia con un timestamp.
Questo approccio è solo un esempio per mostrare come garantire che le righe di log multilinea siano raggruppate come una singola voce di log prima di inoltrarle a IBM Cloud Logs. Ci sono diversi modi per ottenere la stessa cosa.
Applicare il parser in un preprocessore
Configurare un preprocessore nella sezione multilinePreprocessor per applicare il parser ai log.
Ad esempio:
multilinePreprocessor:
- name: multiline
multiline.parser: multiline-nodejs-winston
multiline.key_content: log
Applicare le modifiche.
Se è stata installata una versione precedente di Agent di registrazione e si è aggiornata la configurazione dell'agente modificando la mappa di configurazione direttamente nel cluster, eseguire una copia della mappa di configurazione dal cluster
prima di eseguire il comando helm upgrade. Quando il sito Agent di registrazione viene aggiornato, le modifiche apportate alla mappa di configurazione vengono sovrascritte.
Dopo aver aggiornato il file values.yaml, applicare le modifiche eseguendo il seguente comando sull'installazione client. In questo modo si rigenerano le configurazioni necessarie.
helm upgrade
Verificare i log multilinea
Accedere all'istanza di IBM Cloud Logs e verificare che le voci multilinea (ad esempio, le tracce di stack) siano raggruppate correttamente.
-
Utilizzando la vista Registri
, verificare che le voci multilinea siano raggruppate correttamente.