Is het schrijven van serverlogbestanden naar een database een goed idee?

Na het lezen van een artikel over het onderwerp van O’ Reilly, ik wilde Stack Overflow vragen naar hun mening hierover.


Antwoord 1, autoriteit 100%

Schrijf lokaal naar schijf en voeg vervolgens periodiek een batch in de database in (bijvoorbeeld tijdens de rollover-tijd van het logboek). Doe dat in een apart proces met lage prioriteit. Efficiënter en robuuster…

(Zorg trouwens dat je database-logtabel een kolom bevat voor “van welke computer de loggebeurtenis afkomstig is” – erg handig!)


Antwoord 2, autoriteit 15%

Ik zou nee zeggen, aangezien een vrij groot percentage van de serverfouten problemen met de communicatie met databases met zich meebrengt. Als de database zich op een andere machine zou bevinden, zou netwerkconnectiviteit een andere bron van fouten zijn die niet gelogd konden worden.

Als ik serverfouten in een database zou loggen, zou het van cruciaal belang zijn om een ​​back-uplogger te hebben die lokaal schreef (naar een gebeurtenislogboek of bestand of iets dergelijks) voor het geval de database onbereikbaar zou zijn.


Antwoord 3, autoriteit 6%

Log in op DB als je kunt en het vertraagt ​​je DB niet 🙂

Het is veel sneller om iets in DB te vinden dan in logbestanden. Zeker als je vooruit bedenkt wat je nodig hebt. Als u zich aanmeldt bij db, kunt u de logtabel als volgt doorzoeken:

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

nadat je een fout hebt gevonden, kun je het hele pad zien dat naar deze fout heeft geleid

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

Hoe krijgt u deze informatie als u deze in tekstbestanden inlogt?

Bewerken:
Zoals JonSkeet suggereerde, zou dit antwoord beter zijn als ik zou zeggen dat men zou moeten overwegen om het loggen naar db asynchroon te maken. Dus ik zeg het 🙂 Ik had het gewoon niet nodig. Hoe u dit bijvoorbeeld doet, kunt u controleren op “Ultra Fast ASP.NET” van Richard Kiessig.


Antwoord 4, autoriteit 5%

Als de database een productiedatabase is, is dit een afschuwelijk idee.
U zalproblemen hebben met back-ups, replicatie en herstel. Zoals meer opslagruimte voor DB zelf, eventuele replica’s en back-ups. Meer tijd om replicatie in te stellen en te herstellen, meer tijd om back-ups te verifiëren, meer tijd om DB van back-ups te herstellen.


Antwoord 5, autoriteit 3%

Het is waarschijnlijk geen slecht idee als je de logs in een database wilt hebben, maar ik zou zeggen dat je het advies van het artikel niet opvolgt als je veel logfile-items hebt. Het belangrijkste probleem is dat ik heb gezien dat bestandssystemen problemen hebben met het bijhouden van logs die afkomstig zijn van een drukke site, laat staan ​​een database. Als je dit echt wilt doen, zou ik kijken naar het laden van de logbestanden in de database nadat ze voor het eerst naar schijf zijn geschreven.


Antwoord 6, autoriteit 3%

Denk aan een goed opgezette database die RAM gebruikt voor lezen en schrijven? Dit is zoveel sneller dan schrijven naar schijf en zou niet het schijf-IO-knelpunt opleveren dat u ziet bij het bedienen van grote aantallen clients die optreedt wanneer threads beginnen te vergrendelen omdat het besturingssysteem hen vertelt te wachten op momenteel uitvoerende threads die alle beschikbare IO gebruiken handvatten.

Ik heb geen benchmarks om deze gegevens te bewijzen, hoewel mijn nieuwste applicatie werkt met database-logging. Dit heeft een failsafe zoals vermeld in een van deze reacties. Als de databaseverbinding niet kan worden gemaakt, maakt u een lokale database (h2 misschien?) en schrijft u ernaar. Dan kunnen we een periodieke controle van de databaseconnectiviteit hebben die de verbinding herstelt, de lokale database dumpt en naar de externe database pusht.

Dit kan buiten kantooruren worden gedaan als u geen HA-site heeft.

Ergens in de toekomst hoop ik benchmarks te ontwikkelen om mijn punt te demonstreren.

Veel succes!

Other episodes