Crea file di registro leggibili dalla macchina

4

Attualmente sto sviluppando un nuovo dispositivo, che produce file di testo (di testo). Ci saranno molti dispositivi di questo tipo e voglio analizzare i file di log (per il rilevamento degli errori e le statistiche).

Fino ad ora, l'analisi del log era un prodotto secondario, i file di log di altri dispositivi erano fondamentali per le persone che tentavano di eseguire il debug, quindi le informazioni erano leggibili dall'uomo ("fulltext"). Con il mio strumento di loganalisi automatico, ho analizzato questi file di log cercando più parole chiave, che indicavano linee interessanti del file di registro. Quindi l'analisi è stata molto intensa, perché ho dovuto controllare una riga per più parole chiave ed è possibile che alla fine una riga sia irrilevante per la mia analisi. Nel caso in cui la linea sia rilevante per me, a volte devo analizzare la linea in modo costoso tagliando le informazioni in diverse posizioni nella linea. Complessivamente, l'analisi di questi file di log è molto lenta.

Con il nuovo dispositivo, mi piace implementare più file di log leggibili dalla macchina (ma ancora leggibili dall'uomo), ciò che consente un'analisi più rapida e semplice, anche durante l'implementazione / l'estensione del mio strumento di analisi dei log. Mi sto solo chiedendo, qual è la migliore pratica? La mia prima idea è di usare un "trigger char" in un messaggio di log. Siamo in Germania, quindi ho scelto il simbolo del dollaro, perché non lo usiamo regolarmente. Quando trovo questo trigger-char, so che devo analizzare questa riga (ed evito di cercare più parole chiave). Inoltre, ho pensato che il caso più comune fosse una coppia chiave-valore, che può contenere le informazioni più importanti di un messaggio di registro. Nel caso in cui io abbia più valori (ad esempio un elenco), ho bisogno anche di una versione leggibile da una macchina di questo. Quindi la mia prossima idea era di combinare il trigger-char con un oggetto JSON. Nel caso standard, questo include solo una coppia chiave-valore e lo strumento loganalysis analizzerà questo per motivi di prestazioni con semplici operazioni con le stringhe e non utilizzare una libreria JSON-parser. Ma nel caso che ci sia una lista, creerò un messaggio di log con una JSON-Array e analizzerò questo con un JSON-lib (nel mio caso json-simple). Sugli eventi, inserirò un booleano (il "vero" non è necessario, solo per rimanere conforme a JSON).

Quindi al momento, una linea assomiglia a questa:

05.01.2018 11:11:23: No new APN needed. ${"currentAPN":"m2m-net.sa.t-mobile"}
05.01.2018 11:11:51: can't open gpio 969. ${"openGPIO969failed":true}

Posso migliorare il mio concetto in qualsiasi modo?

Nota a margine: sto utilizzando un parser Java auto-scritto per analizzare i file di log dei vecchi dispositivi, che estenderei per il nuovo progetto. A causa dei log-message "formati" molto speciali (che sono cresciuti nel tempo), qualcosa come Logstash non ha funzionato. Tuttavia, con ElasticSearch e Kibana uso il resto dello stack ELK per le mie analisi log e -visualizzazione.

Nota a margine 2: il nuovo dispositivo è un dispositivo kiosk con Android, quindi è in esecuzione una sola app. Abbiamo il pieno controllo del sistema (proprietario del dispositivo) e anche della maggior parte dell'hardware.

/ modifica: esteso per messaggio evento come menzionato nel primo commento / modifica 2: nuova nota a margine

    
posta MUmla 05.01.2018 - 11:18
fonte

2 risposte

5

Ho avuto molto successo usando un formato "JSON-lines", dove ogni riga nel file di log è un oggetto JSON, per esempio

{"timestamp": "2018-01-05T11:11:23.000Z","Message": "No new APN needed.","currentAPN": "m2m-net.sa.t-mobile"}
{"timestamp": "2018-01-05T11:11:51.000Z","Message": "can't open gpio 969.","openGPIO969failed": true}

Questo formato si presta bene ad essere indicizzato usando gli strumenti di aggregazione dei log (noi usiamo ELK), pur essendo relativamente leggibile. Ci sono anche un sacco di librerie che scrivono questo formato (almeno ci sono nell'ecosistema .Net) - Sono un grande fan di Serilog al momento.

    
risposta data 05.01.2018 - 12:49
fonte
4

Potresti accedere ad alcuni sqlite database (o trovare qualche libreria specializzata di logging, ce ne sono molti).

Potresti decidere per un formato più strutturato del tuo file di registro. Ad esempio, utilizza JSON , YAML , S-expressions , forse preceduto da un codice numerico.

Devi definire e documentare , se il tuo file di registro è testuale, il suo formato di file , forse specificandolo in alcune notazione EBNF .

Altogether, the analysis of these logfiles is very slow.

Se la sintassi del tuo formato è ben progettata e regolare (es. LL (1) grammatica), parsing dovrebbe essere abbastanza veloce.

Ad esempio, se usi la notazione JSON per alcune parti del tuo file di log, puoi essere certo che i caratteri TAB non sono mai usati (poiché in JSON li codificheresti come \t ) , quindi la scheda potrebbe essere utilizzata come separatore di campo.

Prova ad utilizzare i formati esistenti quando possibile (dal tuo settore, forse ce ne sono già alcuni). Altrimenti, definisci e documenta bene alcuni formato aperto (che anche i tuoi concorrenti vorranno utilizzare) . Se possibile, imposta le tue funzioni di registrazione in qualche libreria open source .

    
risposta data 05.01.2018 - 11:43
fonte

Leggi altre domande sui tag