Frage

Wir haben eine Anwendung auf Linux, die den syslog Mechanismus verwendet. Nach einer Woche damit verbracht, diese Anwendung, um herauszufinden, warum lief langsamer als erwartet, stellten wir fest, dass, wenn wir syslog eliminierten und schrieben nur direkt in eine Protokolldatei, die Leistung dramatisch verbessert.

Ich verstehe, warum syslog ist langsamer als die direkte Datei schreibt. Aber ich habe mich gefragt: Gibt es Möglichkeiten, syslog zu konfigurieren seine Leistung zu optimieren

War es hilfreich?

Lösung

Sie können konfigurieren, syslogd (und rsyslog zumindest) nicht die Protokolldateien nach einer Log-Nachricht zu synchronisieren, indem Sie eine Voranstellen „-“ in der Protokolldatei Pfad in der Konfigurationsdatei. Dies beschleunigt die Leistung auf Kosten der Gefahr, dass Log-Meldungen in einem Absturz verloren gehen könnten.

Andere Tipps

Es gibt mehrere Optionen syslog Leistung zu verbessern:

  • Die Optimierung heraus Anrufe mit einem Makro

     int LogMask = LOG_UPTO(LOG_WARNING);
     #define syslog(a, ...) if ((a) & LogMask ) syslog((a), __VA_ARGS__)
    
     int main(int argc, char **argv)
     {
              LogMask = setlogmask(LOG_UPTO(LOG_WARNING));
              ...
     }
    

    Ein Vorteil ein Makro mit syslog Anrufe zu filtern ist, dass der gesamte Anruf reduziert auf einen bedingten Sprung auf eine globale Variable, sehr hilfreich, wenn Sie zufällig haben DEBUG Anrufe, die große Datenmengen durch andere Funktionen übersetzen.

  • setlogmask ()

    setlogmask(LOG_UPTO(LOG_LEVEL))
    

    setlogmask () den Aufruf optimieren, indem nicht auf / dev / log Anmeldung, aber das Programm wird noch ruft die Funktionen als Argumente verwendet.

  • Filterung mit syslog.conf

     *.err                                               /var/log/messages
    

    "Besuche die Manpage syslog.conf für Details."

  • configure syslog zu tun asynchrone oder gepufferte Protokollierung

    metalog verwendet, um Pufferausgang einzuloggen und spülte sie in Blöcken. Lager syslog und syslog-ng tut dies nicht, soweit ich weiß.

Vor dem neuen Daemon einsteigen Schreiben Sie prüfen, ob syslog-ng schneller (oder konfiguriert werden kann, schneller zu sein) als einfache alte syslog.

Ein Trick, den Sie verwenden können, wenn Sie die Quelle auf die Logging-Applikation steuern ist die Protokollebene Sie in der App wollen maskieren sich, statt in syslog.conf. Ich habe vor Jahren mit einer App, die eine riesige, riesige, riesige Menge an Debug-Protokollen erzeugt. Anstatt die Anrufe aus dem Produktionscode zu entfernen, wir maskierten einfach so, dass Debug-Level-Anrufe bekamen nie an den Dämon gesendet. Ich fand den Code, es ist Perl, aber es ist nur eine Front zum setlogmask (3) Aufruf.

use Sys::Syslog;
# Start system logging
# setlogmask controls what levels we're going to let get through.  If we mask
# them off here, then the syslog daemon doesn't need to be concerned by them
# 1   = emerg
# 2   = alert
# 4   = crit
# 8   = err
# 16  = warning
# 32  = notice
# 64  = info
# 128 = debug
Sys::Syslog::setlogsock('unix');
openlog($myname,'pid,cons,nowait','mail');
setlogmask(127); # allow everything but debug
#setlogmask(255); # everything
syslog('debug',"syslog opened");

Nicht sicher, warum ich dezimal verwendet anstelle eines bitmask ... Achselzucken

Schreiben Sie Ihre eigene syslog-Implementierung. :-P

Dies kann auf zwei Wegen erreicht werden.

  1. Schreiben Sie Ihre eigenen LD_PRELOAD Haken die Syslog-Funktionen außer Kraft zu setzen, und sie ausgegeben, anstatt stderr. Ich tatsächlich einen Beitrag zu diesem vielen Jahren schrieb vor: http://marc.info/?m=97175526803720 :-P
  2. Schreiben Sie Ihren eigenen Syslog-Daemon. Es ist nur eine einfache Sache von Datagrammen aus /dev/log greifen! :-P

Okay, okay, so sind diese beiden facetious Antworten. Haben Sie profilieren syslogd zu sehen, wo es Würgen bis am meisten?

Sie können syslogd Niveau (oder Einrichtung) konfigurieren asynchron zu protokollieren, indem ein Minus vor Pfad setzen Logfile (dh .: Benutzer * [Tab] -. / Var / log / user.log).

Prost.

Die syslog-Asynchron () Implementierung, auf der Gefahr der verlorenen Logzeilen helfen kann / begrenzt Verzögerungen zu anderen Zeiten. http://thekelleys.org.uk/syslog-async/

Hinweis: ‚asynchron‘ bezieht sich hier auf Protokollereignisse in Ihrer Anwendung Queuing und nicht die asynchrone syslogd Ausgabedatei Konfigurationsoption, die anderen Antworten beziehen sich auf

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top