0

ログメッセージを吐き出すロガークラス(PHPですが、それは問題ではありません)があります。ロガーはカスタム実装であり、うまく機能します。ただし、各タイプのロガー メッセージにイベント ID を提供するように拡張したいと考えています。たとえば、「ユーザーがログインしたメッセージ」はイベント ID 1、「フォームの検証に失敗しました」はイベント ID 2 です。

このイベント ID の目的は、ログの長いリストを表示するときに、重要でないイベントをフィルター処理することです。データベースで部分文字列検索を行うよりも、ログをイベント ID で分類し、クエリを実行する方が速いと思います。

私は次のアイデアを持っていますが、実行可能な代替案を歓迎します。この例では PHP を使用しましたが、PHP/Java/C# などのほとんどの言語に適用できる十分に汎用的なものが役立ちます。

1) ログ関数呼び出しに暗黙的に ID を含めます。

abstract class EventId {
    const LOGIN = 1;
    const VALIDATION_FAILURE = 2;
    // etc 
}

Logger::messageDebug(EventID::LOGIN, $username . " logged in"); 
Logger::messageWarning(EventID::VALIDATION_FAILURE, "Form failed to validate, etc.");

これの利点はシンプルさですが、少し面倒になるのではないかと心配しています。

2) 変数パラメータをログ メッセージに個別の引数として渡し、最初の文字列をハッシュします。

Logger::messageDebug("%s logged in", $username);
Logger::messageWarning("The %s form failed to validate", $form); 

利点は単純さです。欠点は、イベント ID が最初の文字列のハッシュ (またはその他の関数) に依存してログ メッセージの種類を区別することです。

3) バックトレースして厄介なことをする

function messageDebug($message)  {
    $trace = obtainTraceOfCallToMessageDebug();
    $callToMessageDebug = $trace[0];

    $eventId = "";
    $eventId .= $eventId->file;
    $eventId .= $eventId->line;
    $eventId = sha1($eventId);  

    messageImpl($eventId, $message);
}

これはかなり厄介ですが、既存のログ メッセージを変更する必要がないという利点があり、さらに、新しいログ メッセージを書き込むときにも脆弱ではありません。PHP では、バックトレースを取得するのは簡単で、安価ですが、他の言語では非常に面倒な例外をスローする必要がある場合があります。とにかく、それはアイデアです。

ご意見お待ちしております。私の主な要件は、速度よりも保守性です。私は現在、ナンバー 1 を目指しています - シンプルに保ちます。

4

1 に答える 1

0

私は少し変更を加えた最初のものを使います:

次のようなステートメントでロガーを呼び出したと仮定します。

Logger::messageWarning($message)

私はそれを置き換えます

Logger::messageWarning($message, EventId:someconstant)

EventIdクラスを次のように定義します

abstract class EventId {
    const UNSPECIFIED = 1;
    const LOGIN = 2;
    const VALIDATION_FAILURE = 3;
    // etc 
}

ロガー関数は2番目のパラメーターを受け入れますが、そのためにデフォルト値のを使用しますEventId:UNSPECIFIED

class Logger {
...
  function messageWarning($message, $message_type = EventId:UNSPECIFIED) {
    ...
  }
}

このようにして、既存のコードを壊したり、#3で概説したハッキン​​グを行ったりせず、イベントタイプを追加することで、必要なときに必要な場所でログ呼び出しを置き換えることができます。

于 2011-04-20T12:49:48.507 に答える