9


11

Linux上で syslogメカニズムを使用したアプリケーションがあります。 1週間後にこのアプリケーションの実行速度が予想よりも遅くなった原因を突き止めたところ、syslogを削除してログファイルに直接書き込むと、パフォーマンスが劇的に向上することがわかりました。

syslogが直接ファイル書き込みより遅いのはなぜなのか理解しています。 しかし、私は疑問に思いました:syslogをそのパフォーマンスを最適化するように設定する方法はありますか?

7 Answer


20


設定ファイルのログファイルパスの先頭に " - "を付けることで、ログメッセージの後にログファイルを同期しないようにsyslogd(および少なくともrsyslog)を設定することができます。 これにより、クラッシュ時にログメッセージが失われる危険性がありますが、パフォーマンスが向上します。


6


syslogのパフォーマンスを向上させる方法はいくつかあります。

  • マクロを使用して呼び出しを最適化する

int LogMask = LOG_UPTO(LOG_WARNING); #define syslog(a、...)if((a)

int main(int argc、char ** argv){LogMask = setlogmask(LOG_UPTO(LOG_WARNING)); ... }

マクロを使用してsyslog呼び出しをフィルタリングすることの利点は、呼び出し全体が大域変数での条件付きジャンプに削減されることです。他の関数を介して大きなデータセットを変換するDEBUG呼び出しがある場合に非常に役立ちます。 * setlogmask()

setlogmask(LOG_UPTO(LOG_LEVEL))

setlogmask()は/ dev / logにログインしないことで呼び出しを最適化しますが、プログラムは引数として使用される関数を呼び出します。 * syslog.confによるフィルタリング

* .err / var / log / messages

詳細はsyslog.confのmanページをご覧ください。 * ログ出力をバッファリングしてブロック単位でフラッシュするために使用される非同期またはバッファロギングメタログを実行するようにsyslogを設定します。 stock syslogとsyslog-ngは私の知る限りこれを行いません。


4


新しいデーモンの作成に着手する前に、 syslog-ngが単純な古いsyslogより速いかどうかを確認できます。


3


ロギングアプリケーションへのソースを制御する場合に使用できる1つのトリックは、syslog.confではなく、アプリケーション自体で必要なログレベルを隠すことです。 私は何年も前に、膨大な、膨大な、膨大な量のデバッグログを生成するアプリを使っていました。 本番用コードから呼び出しを削除するのではなく、デバッグレベルの呼び出しがデーモンに送信されないようにマスクしました。 私は実際にコードを見つけました、それはPerlですが、それは単にsetlogmask(3)呼び出しの前線です。

Sys :: Syslogを使用してください。 #システムロギングの開始#setlogmaskは、どのレベルを通過させるかを制御します。 ここでそれらを隠す場合、syslogデーモンはそれらを気にする必要はありません。#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)。 #debug #setlogmask(255)以外のすべてを許可します。 #すべてsyslog( 'debug'、 "syslog opened");

ビットマスクの代わりに10進数を使用した理由がわからない…​


1


あなた自身のsyslog実装を書いてください。 :-P

これには2つの方法があります。

  1. syslog関数をオーバーライドする独自の `LD_PRELOAD`フックを作成し、 代わりにそれらを「stderr」に出力します。 私は実際にこれについて何年も前に記事を書いた:http://marc.info/?m=97175526803720 :-P

  2. あなた自身のsyslogデーモンを書いてください。 つかむのは簡単なことです `/ dev / log`からのデータグラム! :-P

大丈夫、大丈夫、これらはどちらも面倒な答えです。 `syslogd`をプロファイリングして、それがどこで最も渋滞しているのかを調べましたか?


1


logfileへのパスの前にマイナスを付けることでsyslogdのレベル(またはファシリティ)を非同期にログするように設定できます(例:user。* [tab] - / var / log / user.log)。

乾杯。


0


syslog-async()の実装は、ログ行が失われたり遅延が制限されたりする危険性がある場合に役立ちます。 http://thekelleys.org.uk/syslog-async/

注:ここでの「非同期」とは、アプリケーション内でログイベントをキューに入れることを意味し、他の回答で言及されている非同期のsyslogd出力ファイル構成オプションではありません。