Vorrei iniziare impostando brevemente il contesto.
Nella nostra organizzazione (una società di Big Data), ci sono molti sistemi diversi, inclusi siti Web, lavoratori (sistema che ascolta code e / o argomenti), processi pianificati (processi innescati) e così via scritti se tecnologie diverse come come .Net, Java, Python, ecc.
Man mano che l'organizzazione cresce, anche l'ecosistema dei microservizi e la quantità di dati coinvolti. La maggior parte dei nostri sistemi scrive registri su file locali, ma poiché alcuni di essi sono piuttosto vecchi di altri, non esiste un approccio unificato. Poiché non disponiamo di un'architettura di registrazione ben definita e la maggior parte dei nostri sistemi scrive registri su file locali, l'utilizzo di tali registri è diventato difficile. Non siamo in grado di reagire in modo proattivo e leggere i registri è complicato, spesso inutile.
Abbiamo identificato questi requisiti:
- Ci deve essere un modo per raggruppare e tenere traccia di tutti i registri correlati
- I log dovrebbero essere di facile lettura e query
- Le prestazioni non devono essere degradate
- Ogni registro dovrebbe contenere:
- Timestamp
- Sistema
- Ambiente
- istanza
- ActivityId (fattore di raggruppamento)
- Metodo Class +
- Informazioni utili
- Se si tratta di un'eccezione, chiama stack, messaggio, linea, input, ecc.
Sulla base di questi requisiti, abbiamo creato la seguente architettura:
Una pseudo-implementazione dovrebbe assomigliare approssimativamente a questo:
When a system receives a call, checks if that calls already includes an ActivityId, if not creates a unique ActivityId. Each Log then will contain that ActivityId, and every subsequent call to other systems will include that ActivityId
The logging component must smoothly send the logs (in batches or one by one) to the streaming service.
Le domande che si presentano sono:
- Ci manchi qualcosa? L'architettura ha senso?
- Che tipo di considerazioni dovremmo prendere in considerazione?
- Ci sono alcuni componenti che dovrebbero essere presenti e che in realtà non lo sono?
- Indipendentemente dagli errori di implementazione, come architettura, funzionerebbe?
Ci sono altre domande qui, ma la maggior parte di esse si riferisce all'implementazione più che a un'architettura.
Dato che siamo ancora nella fase di progettazione, non abbiamo approfondito i dettagli di implementazione, ma abbiamo visto alcuni buoni approcci utilizzando Serilog e Dataflow per .Net e Log4J per Java.
Qualsiasi suggerimento o suggerimento sono ben accetti.