6

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

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

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

4

2 回答 2

1

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

public class WcfServiceClass
{
    public void ProblemServiceMethod()
    {
        using (log4net.ThreadContext.Stacks["logThisMethod"].Push("ProblemServiceMethod"))
        {
            // can also add the correlationId to the logs using this method.
            // call business logic...

        }
    }
}

然后创建一个自定义 appender来过滤它。

public class IfContextSetFilterAppender : log4net.Appender.AppenderSkeleton
{
    protected override void Append(LoggingEvent loggingEvent)
    {
        bool logThisEntry = false;
        string serviceMethodBeingLogged;

        foreach (object p in loggingEvent.GetProperties())
        {
            System.Collections.DictionaryEntry dEntry = (System.Collections.DictionaryEntry)p;
            if (dEntry.Key == "logThisMethod")
            {
                logThisEntry = true;
                serviceMethodBeingLogged = dEntry.Value.ToString();
            }
        }

        if (!logThisEntry)
            return; // don't log it.

        // log it.
    }
}

这是该想法的非常简单(但清晰)的示例。

如果我真的像您描述的那样将其构建成大规模的服务,我会:

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

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

通过执行该行为,您可以通过单独的配置来控制生产服务的日志记录,而无需接触服务代码。

于 2012-10-15T15:50:45.750 回答
0

您可以为该特定服务调用创建一个新的日志记录源,然后启用诊断来过滤它。

  <system.diagnostics>
    <sources>
      <source name="Your.Source.Here" switchValue="Verbose">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" traceOutputOptions="LogicalOperationStack" initializeData="l:\logs\N4S.MSO.ADC.Host.svclog" />
    </sharedListeners>
  </system.diagnostics>
于 2012-10-15T08:56:41.870 回答