反復同期プロセスを行う複雑な分散サービスを開発しています。異なる情報システムのビジネス エンティティを 10 秒ごとに同期します。1 回の反復は、ビジネス オブジェクトの現在の状態 (顧客数、商品、特定の顧客と商品の詳細など) を取得するための一連のサード パーティ サービス呼び出しで構成され、ローカル DB にクエリを実行し、それらの違いを取得して平滑化し、これを同期します。違い。
繰り返しにはさまざまな種類があります。それらは高速 (一連のオブジェクトの変更のみ) であり、反復は低速 (データの完全なレビュー) です。高速は 10 秒ごと、低速は 1 日 1 回です。
では、NLog を使用してこのプロセスをどのようにログに記録できますか? データの保存に SQLite を使用しています。しかし、ログの DB 設計に行き詰まっています。
1. オブジェクトの現在の状態をサード パーティ サービスに要求する 2. ローカル データベースにオブジェクトの現在の状態を問い合わせる 3. 差分リストを取得する 4. 外部サービスを呼び出して不十分なデータをコミットする 5. 更新する不十分なデータのローカル データベース
TEXT
しかし、ログに記録する情報は非常に多くの種類があるため、1 つのフィールドにまとめることはできません。
現時点では、ログにそのような構造を使用しています:
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);
したがって、すべてのサービス要求と応答は、すべての応答をすべての要求にリンクするための鍵とdescription
なります。request_response_pair
これが私の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);
}
}
}
ログレベルについては知っていますが、この詳細なログがすべて必要なので、情報としてログに記録します。これらの複雑で構造化されたログを記録する方法のチュートリアルが見つかりません。単純なダム ログ メッセージのみ。