0

我正在尝试在服务工作流混合应用程序中实现日志记录机制。日志记录的要求是,对于独立的日志操作,每个日志必须被视为一个详细操作,并针对父/主操作放置。所以,它是一个父子,并进入数据库表。这是主要原因,NLog 失败。

为了帮助更好地理解,我正在深入了解一般细节。这是应用程序流程的方式:

工艺流程

现在,应用程序(通常称为 Program.cs)的 Main 入口点是Platform。它初始化一个引擎,该引擎能够侦听来自 ISDN 线路、VoIP 或 Web 服务的传入呼叫。该接口是通用的,因此到达平台的任何调用都会触发OnConnecting()OnConnecting()是一个线程安全事件,可以根据系统需要多次触发。

OnConnecting()中,我们的自定义工作流管理器的一个新实例被启动,上下文是一个名为ProcessingInfo的自定义对象:

new WorkflowManager<ZeProcessingInfo>();

其中,ZeProcessingInfo:

var ZeProcessingInfo = new ProcessingInfo(this, new LogMaster());

如您所见,ProcessingInfoPlatform本身和一个新的LogMaster实例组成。LogMaster在一个独立的程序集中定义。

现在这个LogMaster在整个WorkflowManager中可用,它启动的所有工作流,任何正在运行的Workflow中的所有活动,并传递给从任何Activity中调用的外部代码。现在,当初始化一个新的LogMaster时,会在数据库中创建一个Master Operation条目,并且这个LogMaster对象现在一直存在,直到这个调用在一系列非常严重的过山车通过不同的工作流程后结束。每次调用OnConnecting()时,都会创建并维护一个新的主操作。

LogMaster允许调用AddDetail ()方法,在内部存储的主操作(通过 Guid 主键区分)下添加新的子细节。LogMaster建立在实体框架之上

而且,我可以根据需要多次登录同一个主操作。但是应用程序的需求正在发生变化,现在需要从其他程序集中进行日志记录。有一个Platform Server程序集,它是一个 Windows 服务,它充当服务器侦听基于 Web 服务的调用,一旦客户端调用一个方法,就会触发Platform中的OnConnecting 。

我需要一种机制来以某种方式检索相关的 LogMaster 对象,以便我可以将详细信息添加到同一个主操作。但是Platform Server是在Platform上触发OnConnecting()并因此实例化LogMaster的一次。这会创建一个冗余循环。

此外,还考虑了故障场景。如果 LogMaster 失败,需要从 Database Logging 恢复到 Event Logging。如果事件日志记录失败(或通过统一配置不允许),则需要恢复为基于文件 (XML) 的日志记录。

我希望我已经给出了一个粗略的想法。我不期望代码,但我需要一些策略来支持主子操作的非常无缝的可插入可配置日志记录机制。

谢谢阅读。任何帮助将非常感激。

4

1 回答 1

0

我已经多次阅读这个问题,很难弄清楚发生了什么。我认为您的图表根本没有帮助。如果您的问题是关于在编写子日志记录时尝试检索主日志记录,那么我会忘记尝试在日志表中创建规范化数据。在尝试这样做时,您只会减慢事务系统的速度。您希望日志/审计记录尽可能快地写入,并且您可以稍后在您想阅读它们时聚合它们。

为日志条目创建一个非规范化表,并使用该表中的单个 Guid 来跟踪会话/父日志主控。是的,这将是一张大桌子,但它会写得很快。

至于保证将日志消息传递到目的地,我会尽量不要创建多个目的地,因为稍后将它们组合起来将是一场噩梦,而是使用 MSMQ 之类的东西尽快发出审计日志,并让另一个服务接收它们并以有保证的交付方式处理它们。ETW(事件记录)不能保证在负载下,您不会知道它已经失败。

于 2012-03-20T19:44:08.127 回答