2013-05-30 2 views
6

私は、繰り返しの同期プロセスを行う複雑な分散サービスを開発しています。それは、異なる情報システムの10秒ごとのビジネスエンティティを同期させます。 1つの反復は、ビジネスオブジェクトの現在の状態(顧客、商品、特定の顧客および商品の詳細など)を取得し、ローカルDBに照会してそれらの間の相違を取得し、スムーズアウトするための3Dパーティーサービスコールの束で構成されます。違い。複雑な同期プロセスをどのように記録するのですか?

イテレーションのタイプが異なります。それらは高速です(オブジェクトのセット内の変更だけです)、遅い反復(データの完全なレビュー)です。速いのは10秒ごと、遅いのは1日に1回です。

NLogを使用してこのプロセスをどのように記録できますか?私はデータを格納するためにSQLiteを使用しています。しかし、私はログのためにDBデザインに悩まされています。

だから私はすべての繰り返しの流れ記録したい:3Dパーティのサービスに 2.クエリをオブジェクトの現在の状態について 1.要求のオブジェクトの現在の状態のためのローカルデータベースを 3.相違点のリスト 4.起動外部を取得します。不十分なデータをコミットするサービス 5.不十分なデータのためにローカルデータベースを更新する

しかし、ログする情報の種類がたくさんあるので、ただ1つのTEXTフィールドに入れることはできません。だから、すべてのサービス要求と応答がdescriptionに置き、request_response_pairはリクエストごとにすべての応答をリンクするための鍵である

CREATE TABLE [Log] (
    [id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    [ts] TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    [iteration_id] varchar, 
    [request_response_pair] varchar, 
    [type] VARCHAR NOT NULL, 
    [level] TEXT NOT NULL, 
    [server_id] VARCHAR, 
    [server_alias] VARCHAR, 
    [description] TEXT, 
    [error] Text); 

:私はログのような構造を使用しています現時点では

。ここで

は私NLogの設定である:ここで

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" internalLogFile="D:\nlog.txt" internalLogLevel="Trace"> 
    <targets> 
    <target name="Database" xsi:type="Database" keepConnection="false" 
      useTransactions="false" 
      dbProvider="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.82.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" 
      connectionString="Data Source=${basedir}\SyncLog.db;Version=3;" 
      commandText="INSERT into Log(iteration_id, request_response_pair, type, level, server_id, server_alias, description, error) values(@Iteration_id, @Request_response_pair, @Type, @Loglevel, @server_id, @server_alias, @Description, @Error)"> 
     <parameter name="@Type" layout="${message}"/> 
     <parameter name="@Loglevel" layout="${level:uppercase=true}"/> 
     <parameter name="@Request_response_pair" layout="${event-context:item=request_response_pair}"/> 
     <parameter name="@Iteration_id" layout="${event-context:item=iteration_id}"/> 
     <parameter name="@server_id" layout="${event-context:item=server_id}"/> 
     <parameter name="@server_alias" layout="${event-context:item=server_alias}"/> 
     <parameter name="@Description" layout="${event-context:item=description}"/> 
     <parameter name="@Error" layout="${event-context:item=error}"/> 
    </target> 
    </targets> 
    <rules> 
    <logger name="*" minlevel="Trace" writeTo="Database" /> 
    </rules> 
</nlog> 

は私がログインする方法である:

namespace NLog 
{ 
    public static class LoggerExtensions 
    { 
     public static void InfoEx(this Logger l, string message, Dictionary<string, object> contextParams) 
     { 
      LogEventInfo eventInfo = new LogEventInfo(LogLevel.Info, "", message); 
      foreach (KeyValuePair<string, object> kvp in contextParams) 
      { 
       eventInfo.Properties.Add(kvp.Key, kvp.Value); 
      } 

      l.Log(eventInfo); 
     } 

     public static void InfoEx(this Logger l, string message, string server_id, string server_alias, Dictionary<string, object> contextParams = null) 
     { 
      Dictionary<string, object> p = new Dictionary<string, object>(); 
      p.Add("server_id", server_id); 
      p.Add("server_alias", server_alias); 
      if (contextParams != null) 
      { 
       foreach (KeyValuePair<string, object> kvp in contextParams) 
       { 
        p.Add(kvp.Key, kvp.Value); 
       } 
      } 

      l.InfoEx(message, p); 
     } 
    } 
} 

私はログレベルについて知っているが、私はこのすべて冗長ログを必要とするので、私は情報としてそれをログに記録します。私はこれらの複雑で構造化されたログを記録する方法をチュートリアルで見つけることができません。平凡なダムログメッセージのみ。

+8

申し訳ありませんが、あなたの質問は何ですか? – Dirk

+0

私はエンタープライズライブラリをログに記録します。 ELを使用すると、イベントビューア、データベース、XML、フラットファイルなどをログ/トレースすることができます。何も変更することなく、app.config(web.config)でのみコードを実行できます。タイプ、優先順位、その他の方法でフィルタリングすることもできます。 http://msdn.microsoft.com/en-us/library/ff648549.aspx – Max

答えて

1

私は、典型的な「ログのもの」の「ログ」について話しているので、ワークフロー(エラー/パフォーマンス)を調べる必要があるかどうかを確認する必要があります。私はあなたがログを意味していないと仮定します。 「会計情報が必要で、ログはドメインデータの一部であり、ワークフローに含まれています」と述べています。

あなたの投稿から得たものから、後でログを処理して前記診断に使用できるように、ログのバックエンド記憶形式について心配していますか?


次に、ドメイン固有のログコードを独立させることをお勧めします。

質問:作成したログはどのように処理されますか?あなたは実際にそれらの場所にアクセスする必要がありますので、あなたは構造化ビューを提供するデータベースが必要ですか?あなたのログをどのくらい速くフィルタリングすることができるかは関係ありますか?とにかく1つの大きなログアナライザアプリケーションに終わるでしょうか?何か悪いことが起きた2週間目にのみ実行されますか?私の意見で

は、ログ内の任意のドメインの仕様を避けたい最大の理由は、「物事がを間違って行けばログが動作するはずです」と、「物事がを変更した後ログが動作するはず」ということです。

ログは、ログ自体を書くために、その後、あなたは「Request_response_pair」などのドメイン固有の値についてあなたのログテーブルの列を持って、そして何のペアが存在しない場合は、物事が間違っ

を行けば(例えば失敗する可能性があります動作するはずですインデックスフィールドの場合)。もちろん、DBデザインにはNULL以外の列を持たず、制約もないことを確認できますが、一歩前に戻って質問してください。なぜ、あなたのログデータベースに構造が必要なのですか?ログはできるだけ信頼できるものとして動作するように設計されているため、テンプレートを使用すると、ユースケースが制限されたり、重要な情報を記録できないことがあります。物事はあなたがregulary後」からログに「変更前」からログを比較することを意味している、あなたはバグを検出し、固定するためのログを必要とするか、パフォーマンスを向上させる場合は特に

を変更した後

ログが動作するはずです変化する"。ドメインデータを変更したため、ログデータベースの構造を変更する必要がある場合は、ログを比較する必要があるときに傷つきます。

データ構造を変更すると、ログアナライザなどのツールを更新する必要があるかもしれませんが、通常、ログの実際の構造に完全に不可知論的なログ/解析コードの大部分があります。ドメイン。 (複雑なものを含む)


多くのシステムでは、一緒に暮らすことができる彼らはフィルタリングしたり、ログを処理する必要がある場合は、離れて再び文字列を取るためのツールを作成し、後に「一つだけの単純な文字列をログに記録」と。

他のシステムでは、単純な文字列のキーと値のペアでログを書き込みます。ログ関数自体はドメイン固有のものではなく、単に文字列辞書を受け取り、それを書き出します(さらに簡単には、パラメータの偶数が必要なparams文字列[]、すべての2番目のパラメータをキーとして使用します)。その命題によって怖がっている: - D)。

もちろん、ドメイン固有のデータ構造を知っている基本ログ関数の上にもう1つのツールレイヤーを作成してから、文字列辞書を作成して渡すことになります。あなたは確かにすべての場所の分解コードをコピーしたくありません。しかし、あなたが何かを記録したいかもしれないすべての場所で基本機能を利用できるようにしてください。その情報が欠落している「奇妙な」状況(例外ハンドラ)に実際に遭遇した場合、本当に役立ちます。

関連する問題