我正在尝试在服务工作流混合应用程序中实现日志记录机制。日志记录的要求是,对于独立的日志操作,每个日志必须被视为一个详细操作,并针对父/主操作放置。所以,它是一个父子,并进入数据库表。这是主要原因,NLog 失败。
为了帮助更好地理解,我正在深入了解一般细节。这是应用程序流程的方式:
现在,应用程序(通常称为 Program.cs)的 Main 入口点是Platform。它初始化一个引擎,该引擎能够侦听来自 ISDN 线路、VoIP 或 Web 服务的传入呼叫。该接口是通用的,因此到达平台的任何调用都会触发OnConnecting()。OnConnecting()是一个线程安全事件,可以根据系统需要多次触发。
在OnConnecting()中,我们的自定义工作流管理器的一个新实例被启动,上下文是一个名为ProcessingInfo的自定义对象:
new WorkflowManager<ZeProcessingInfo>();
其中,ZeProcessingInfo:
var ZeProcessingInfo = new ProcessingInfo(this, new LogMaster());
如您所见,ProcessingInfo由Platform本身和一个新的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) 的日志记录。
我希望我已经给出了一个粗略的想法。我不期望代码,但我需要一些策略来支持主子操作的非常无缝的可插入可配置日志记录机制。
谢谢阅读。任何帮助将非常感激。