WCF服务,垂直记录

Dan*_*Fox 6 .net c# wcf logging nlog

我一直在寻找WCF服务的日志记录(包括像NLog和PostSharp这样的技术),但是我还有一些我还没有解决的问题......我不知道我是否遗漏了一些明显的东西或者它是不可能的.

假设我有一个包含100多个Web服务调用入口点的WCF服务层.其中一个是造成问题.该层下面是业务逻辑层和数据库层.我想做的(我认为)是打开该服务调用的日志记录(其中包括相关的活动ID),以便记录对该服务的任何调用,并且还记录较低层中的任何日志消息.我真的不想打开较低层的程序集级别的日志记录,因为它们将被许多Web服务方法共享.

这是否可能,通过现有框架或以创造性方式使用CorrelationManager之类的东西?

Ern*_*ieL 1

在 log4net 中,您可以在线程上下文上设置一个属性,该属性将包含在线程的所有日志记录事件中。

\n\n
public class WcfServiceClass\n{\n    public void ProblemServiceMethod()\n    {\n        using (log4net.ThreadContext.Stacks["logThisMethod"].Push("ProblemServiceMethod"))\n        {\n            // can also add the correlationId to the logs using this method.\n            // call business logic...\n\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后创建一个自定义的appender按其过滤的自定义附加程序。

\n\n
public class IfContextSetFilterAppender : log4net.Appender.AppenderSkeleton\n{\n    protected override void Append(LoggingEvent loggingEvent)\n    {\n        bool logThisEntry = false;\n        string serviceMethodBeingLogged;\n\n        foreach (object p in loggingEvent.GetProperties())\n        {\n            System.Collections.DictionaryEntry dEntry = (System.Collections.DictionaryEntry)p;\n            if (dEntry.Key == "logThisMethod")\n            {\n                logThisEntry = true;\n                serviceMethodBeingLogged = dEntry.Value.ToString();\n            }\n        }\n\n        if (!logThisEntry)\n            return; // don\'t log it.\n\n        // log it.\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

那\xe2\x80\x99是这个想法的非常简单(但清晰)的例子。

\n\n

如果我真的将其构建为您所描述的大规模服务,我会:

\n\n
    \n
  1. 创建一个IOperationInvoker端点行为,该行为获取方法名称并为其应用的所有调用设置 log4net 上下文值。

  2. \n
  3. (可选)让附加程序从 app.config 读取应记录的所有服务方法名称的过滤器列表。(如果您选择将 OperationInvoker 行为应用于哪些方法,则附加程序不需要这种复杂性。)

  4. \n
\n\n

通过执行此行为,您可以使用多种选项来仅通过配置来控制生产服务上的日志记录,而无需触及服务代码。

\n