La scrittura di file di log del server in un database è una buona idea?

Dopo aver letto un articolo sull’argomento di O’Reilly , volevo chiedere a Stack Overflow le loro opinioni in merito.

Scrivi localmente su disco, quindi inseriscilo periodicamente nel database (ad es. Al momento del rollover del registro). Fatelo in un processo separato, a bassa priorità. Più efficiente e più robusto …

(Assicurati che la tabella dei log del tuo database contenga una colonna per “da quale macchina è partito l’evento del registro” – molto utile!)

Direi di no, dato che una percentuale piuttosto ampia di errori del server coinvolge problemi nella comunicazione con i database. Se il database si trovava su un’altra macchina, la connettività di rete sarebbe un’altra fonte di errori che non è stato ansible registrare.

Se dovessi registrare errori del server in un database, sarebbe fondamentale disporre di un logger di backup che scrivesse localmente (in un registro eventi o file o qualcosa del genere) nel caso in cui il database fosse irraggiungibile.

Accedi al DB se puoi e non rallenta il tuo DB 🙂

È molto più veloce trovare qualsiasi cosa nel DB, quindi nei file di registro. Soprattutto se pensi in anticipo di cosa avrai bisogno. La registrazione in db consente di eseguire query sulla tabella dei registri in questo modo:

select * from logs where log_name = 'wcf' and log_level = 'error' 

poi dopo aver trovato l’errore puoi vedere l’intero percorso che porta a questo errore

 select * from logs where contextId = 'what you get from previous select' order by timestamp 

Come otterrete queste informazioni se la registrate in file di testo?

Modifica: come suggerito da JonSkeet, questa risposta sarebbe meglio se affermassi che si dovrebbe prendere in considerazione la registrazione su db asincrono. Quindi lo dico 🙂 Non ne avevo proprio bisogno. Ad esempio come farlo puoi controllare “Ultra Fast ASP.NET” di Richard Kiessig.

Se il database è un database di produzione, questa è un’idea orribile. Avrai problemi con backup, replica, recupero. Come più spazio di archiviazione per DB stesso, repliche, se presenti, e backup. Più tempo per configurare e ripristinare la replica, più tempo per verificare i backup, più tempo per recuperare il DB dai backup.

Probabilmente non è una ctriggers idea se si vogliono i registri in un database ma direi di non seguire il consiglio dell’articolo se si hanno molte voci nel file di registro. Il problema principale è che ho visto problemi con i file system al passo con i registri provenienti da un sito occupato e tanto meno un database. Se vuoi davvero farlo, guarderei il caricamento dei file di registro nel database dopo che sono stati scritti per la prima volta sul disco.

Pensa a un database correttamente configurato che utilizza la RAM per le letture e le scritture? Questo è molto più veloce della scrittura su disco e non presenterebbe il collo di bottiglia del disco IO che viene visualizzato quando viene utilizzato un numero elevato di client che si verifica quando i thread iniziano a bloccarsi a causa del sistema operativo che li informa di attendere i thread in esecuzione che utilizzano tutti gli I / O disponibili maniglie.

Non ho alcun benchmark per provare questi dati, sebbene la mia ultima applicazione stia funzionando con la registrazione del database. Questo avrà un failsafe come menzionato in una di queste risposte. Se la connessione al database non può essere creata, creare un database locale (h2 forse?) E scrivere a quello. Quindi possiamo avere un controllo periodico della connettività del database che ristabilirà la connessione, eseguirà il dump del database locale e lo invierà al database remoto.

Questo potrebbe essere fatto durante le ore libere se non si dispone di un sito HA.

A volte in futuro spero di sviluppare benchmark per dimostrare il mio punto.

In bocca al lupo!