gpt4 book ai didi

c# - WCF 服务,垂直记录

转载 作者:太空狗 更新时间:2023-10-29 21:58:43 25 4
gpt4 key购买 nike

我一直在研究 WCF 服务的日志记录(包括 NLog 和 PostSharp 等技术),但我还有一些事情还没有解决……我不知道我是否遗漏了一些明显的东西,或者只是不可能。

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

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

最佳答案

在 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...

}
}
}

然后 create a custom 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. (可选)让 appender 从 app.config 中读取应记录的所有服务方法名称的过滤器列表。 (如果您选择将 OperationInvoker 行为应用于哪些方法,则附加程序不需要这种复杂性。)

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

关于c# - WCF 服务,垂直记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12892137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com