我正在尝试在Service-Workflow-hybrid应用程序中实现日志记录机制。对日志记录的要求是,对于独立日志操作,必须将每个日志视为详细操作,并将其放在父/主操作上。所以,它是一个父子,并转到数据库表。这是NLog失败的主要原因。
为了更好地理解,我正在深入了解一般情况。这是应用程序流程的方式:
现在,应用程序的主要入口点(通常称为Program.cs)是平台。它初始化一个能够监听来自ISDN线路,VoIP或Web服务的来电的引擎。该界面是通用的,因此任何到达平台的调用都会触发 OnConnecting()。 OnConnecting()是一个线程安全的事件,可以根据系统需要多次触发。
在 OnConnecting()中,我们启动了自定义Workflow管理器的新实例,并且上下文是一个名为 ProcessingInfo 的自定义对象:
new WorkflowManager<ZeProcessingInfo>();
其中,ZeProcessingInfo:
var ZeProcessingInfo = new ProcessingInfo(this, new LogMaster());
如您所见, ProcessingInfo 由平台本身和 LogMaster 的新实例组成。 LogMaster 在独立程序集中定义。
此 LogMaster 现在可用于 WorkflowManager ,它启动的所有工作流程,任何正在运行的工作流程中的所有活动,并传递从任何 Activity 中调用的外部代码。现在,当初始化新的 LogMaster 时,会在数据库中创建主操作条目,此 LogMaster 对象现在一直存在,直到此调用结束经过一系列非常严肃的过山车穿越不同的工作流程。每次调用 OnConnecting()时,都会创建并维护一个新的主操作。
LogMaster 允许调用 AddDetail()方法,该方法在内部存储的主操作(通过Guid主键区分)下添加新的子详细信息。 LogMaster 是基于Entity Framework构建的。
而且,我可以根据需要多次登录相同的主操作。但是应用程序要求正在发生变化,现在需要从其他程序集进行日志记录。有一个 Platform Server 程序集是一个Windows服务,它充当服务器,监听基于Web服务的调用,一旦客户端调用方法,平台中的 OnConnecting 被触发。
我需要一种机制以某种方式检索相关的LogMaster对象,以便我可以向同一个Master Operation添加细节。但 Platform Server 是在平台上触发 OnConnecting(),从而实例化 LogMaster 。这会创建一个冗余循环。
此外,还考虑了故障情况。如果LogMaster失败,则需要从数据库日志恢复到事件日志记录。如果事件记录失败(或不允许通过统一配置),则需要恢复到基于文件的(XML)日志记录。
我希望我给出了一个粗略的想法。我不期望代码,但我需要一些策略来实现支持Master-Child操作的非常无缝的可插拔可配置日志记录机制。
感谢阅读。任何帮助将不胜感激。
答案 0 :(得分:0)
我已经多次阅读过这个问题了,很难弄清楚发生了什么。我认为你的图表根本没有帮助。如果您的问题是在编写子日志记录时尝试检索主日志记录,那么我将忘记尝试在日志表中创建规范化数据。您只会在尝试这样做时放慢交易系统的速度。您希望日志/审计记录尽可能快地写入,以后可以在想要阅读时将它们聚合在一起。
为日志条目创建一个非规范化表,并使用该表中的单个Guid来跟踪会话/父日志主数据。是的,这将是一个很大的表,但它会写得很快。
至于保证将日志消息传递到目的地,我会尝试不创建多个目的地,因为以后组合它们将是一场噩梦,而是使用像MSMQ这样的东西来尽可能快地发出审计日志并拥有另一个服务选择他们以有保证的交付方式处理它们。 ETW(事件记录)在负载下无法保证,您不会知道它已经失败。