我正在开发一个复杂的分布式服务,它可以进行迭代同步过程。它每 10 秒同步不同信息系统中的业务实体。一次迭代由一堆 3d 方服务调用组成,以检索业务对象的当前状态(客户计数、商品、某些客户和商品详细信息等),查询本地数据库,然后获取它们之间的差异并平滑,同步差异。
有不同类型的迭代。它们速度快(仅更改一组对象)和缓慢的迭代(全面审查数据)。快是每 10 秒一次,慢是一天一次。
那么,如何使用 NLog 记录这些进程呢?我正在使用 SQLite 来存储数据。但是我被困在日志的数据库设计中。
所以我想记录每次迭代的流程: 1. 向 3d 方服务请求对象的当前状态 2. 查询本地数据库以获取对象的当前状态 3. 获取差异列表 4. 调用外部服务提交不足的数据 5. 更新本地数据库数据不足
但是要记录的信息种类繁多,所以我不能把它放在一个TEXT
字段中。
目前我正在为日志使用这样的结构:
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);
}
}
}
我知道日志记录级别,但我需要所有这些详细日志,所以我将其记录为信息。我找不到任何教程如何记录这些复杂的结构化日志。只有普通的愚蠢日志消息。