監査ログ

変更の簡単なログで、簡単に書き込めて邪魔にならないようにすることを意図しています。

これは、私が2000年代半ばに行っていたより高度なエンタープライズアプリケーションアーキテクチャの開発に関する執筆の一部です。残念なことに、他の多くのことに気を取られて、それ以降それらに取り組む時間がなく、近い将来も時間を見つけることは難しいと考えています。そのため、この資料は非常に下書きの形であり、再び取り組む時間が見つかるまで、修正や更新を行うことはありません。

仕組み

監査ログは、最も単純でありながら、時間的情報を追跡する最も効果的な方法の1つです。重要な何かが起こるたびに、何が起こったのか、そしていつ起こったのかを示す記録を書き込むという考え方です。

監査ログは、さまざまな物理的な形式を取ることができます。最も一般的な形式はファイルです。ただし、データベーステーブルも優れた監査ログになります。ファイルを使用する場合は、形式が必要です。ASCII形式は、特別なソフトウェアなしで人間が読めるようにするのに役立ちます。単純な表形式の場合は、タブ区切りのテキストが簡単で効果的です。より複雑な構造は、XMLでうまく処理できます。

監査ログは簡単に書き込むことができますが、特に大きくなるにつれて読みにくくなります。一時的なアドホック読み取りは、目と単純なテキスト処理ツールで実行できます。より複雑または反復的なタスクは、スクリプトで自動化できます。多くのスクリプト言語は、テキストファイルを処理するのに適しています。データベーステーブルを使用する場合は、SQLスクリプトを保存して情報にアクセスできます。

監査ログを使用する場合は、常に実際の記録日と記録日の両方を書き出すことを検討する必要があります。これらは簡単に作成でき、99%は同じである可能性が高いですが、1%が役に立つ可能性があります。これを行うときは、記録日は常に現在の処理日であることを覚えておいてください。

使用するタイミング

監査ログの素晴らしさは、そのシンプルさにあります。監査ログ一時的プロパティ一時的オブジェクトなどの他のパターンと比較すると、これらの代替手段はオブジェクトモデルに多くの複雑さを追加していることにすぐに気づきます。ただし、これらはどちらも有効性をいたるところで使用するよりも、その複雑さを隠すのが優れていることが多いです。

しかし、監査ログの処理の難しさがその制限です。過去のデータの組み合わせに基づいて毎週請求書を作成している場合、ログを処理するためのすべてのコードは遅く、保守が難しくなります。したがって、すべては時間的情報へのアクセスが通常のソフトウェアプロセスにどれだけ緊密に統合されているかによって異なります。統合が緊密になるほど、監査ログの有用性は低くなります。

モデルの一部に監査ログを使用し、他の場所で他のパターンを使用できることを忘れないでください。時間の1つの次元に監査ログを使用し、別の次元に別のパターンを使用することもできます。したがって、プロパティの実際の時間履歴を一時的プロパティで処理し、記録履歴を処理するために監査ログを使用する場合があります。

例(Java)

単純な監査ログは非常にシンプルになる可能性があります。

class Customer...

  private String phone;
  public String getPhone() {
    return (phone == null) ? "none" : phone;}
  public void setPhone(String arg, MfDate changeDate) {
    log (changeDate, this, "change of phone", phone, arg);
    phone = arg;
  }
  public void setPhone(String arg) {
    setPhone(arg, MfDate.today());
  }
  private static void log (MfDate validDate, Customer customer, String description, Object oldValue, Object newValue) {
    try {
      logfile().write(validDate.toString() + customer.name() + "\t" + description + 
        "\t" + oldValue + "\t" + newValue + "\t" + MfDate.today() + "\n");
      logfile().flush();
    } catch (IOException e) {throw new ApplicationException ("Unable to write to log");}
  }

設定メソッドは実際の時間のみを使用しているにもかかわらず、記録日(ログにMfDate.today)も追加しました。簡単に追加でき、追加しないと後で再構成できないため、両方の日付を追加するのが賢明だと思います。

任意の日付で私の電話番号を調べるスクリプトは、読者の演習として残しておきます。(明らかに、ここで書き出すには些細すぎます...)