私は、繰り返しの同期プロセスを行う複雑な分散サービスを開発しています。それは、異なる情報システムの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);
}
}
}
私はログレベルについて知っているが、私はこのすべて冗長ログを必要とするので、私は情報としてそれをログに記録します。私はこれらの複雑で構造化されたログを記録する方法をチュートリアルで見つけることができません。平凡なダムログメッセージのみ。
申し訳ありませんが、あなたの質問は何ですか? – Dirk
私はエンタープライズライブラリをログに記録します。 ELを使用すると、イベントビューア、データベース、XML、フラットファイルなどをログ/トレースすることができます。何も変更することなく、app.config(web.config)でのみコードを実行できます。タイプ、優先順位、その他の方法でフィルタリングすることもできます。 http://msdn.microsoft.com/en-us/library/ff648549.aspx – Max