gpt4 book ai didi

wcf - 使用log4net或NLog的WCF日志记录/跟踪和事件ID传播

转载 作者:行者123 更新时间:2023-12-02 10:43:17 25 4
gpt4 key购买 nike

我在日志记录中看到了许多其他问题。最佳做法。什么日志记录平台是最好的。等等,这里有一些关于SO的链接,并对该主题进行了很好的讨论:

logging best practices

log4net vs TraceSource

best logging solution for .NET 3.5 project

.NET 3.5 logging

开始编辑:

键入了这篇长文章之后,我想我要弄清楚的主要事情是WCF日志记录/跟踪与 Activity ID传播与System.Diagnostics和TraceSources紧密相关。使用第三方日志记录平台(例如log4net或NLog),您能否获得“良好的” WCF记录/跟踪和 Activity ID传播。如果执行此操作,该怎么做?

有关ServiceTraceViewer的一些问题,请参阅本文的底部,

结束编辑。

这些职位均未详细讨论我的问题的主题。我对人们在日志记录和WCF方面的工作很感兴趣。如果您正在开发一个包含WCF服务的项目,并且已经登录了项目,则是否要做出特殊的努力来使用特定于WCF的日志记录功能。特别是,您是否尝试合并诸如 Activity 跟踪, Activity 传播和端到端跟踪之类的内容?如MSDN的this文章中概述的那样。 Here是MSDN上有关传播 Activity 的另一篇文章。

这些文章很好地解释了如何使用System.Diagnostics TraceSources进行 Activity 跟踪, Activity 传播以及端到端跟踪。它显示了如何配置WCF以通过app.config / web.config文件“打开”这些选项。 WCF在内部使用TraceSources记录通信结果。

这是一些示例代码(来自上面链接的第二篇MSDN文章),或多或少显示了如何通过System.Diagnostics和TraceSources实现 Activity 传播:

TraceSource ts = new TraceSource("myUserTraceSource");
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");

double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");

ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;

您可以通过一种方法从服务内部判断WCF是否传播了 Activity :
// Check if an activity was set in scope by WCF, i.e., if it was 
// propagated from the client. If not, i.e., ambient activity is
// equal to Guid.Empty, create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
Guid newGuid = Guid.NewGuid();
Trace.CorrelationManager.ActivityId = newGuid;
}
// Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");

// Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add "
+ n1 + ", " + n2);
// double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);

// Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
// return result;

从我看到的所有示例中,都可以通过配置System.Service模型TraceSource(通常通过app.config)并将其propagationActivity属性设置为“true”来实现 Activity 传播。实际上,通过在Trace.CorrelationManager.ActivityId上设置 Activity ID(引导)来传播 Activity 。如果使用log4net或NLog,可以有效地使用WCF日志记录和 Activity 传播吗?

我的项目将大量使用WCF。我们目前正在尝试确定我们的日志记录解决方案。我认为我对WCF日志记录和 Activity 传播如何与System.Diagnostics和TraceSources一起使用有很好的了解。我想更好地了解如何/是否可以使用log4net和NLog等日志记录平台实现类似的功能。

他们提供一些“本地”支持吗?他们提供某种基础设施的可能性似乎更高一些,以便可以“手动”实现 Activity 传播。也许是这样的:
//Inside client code:
ILog logger = LogManager.GetLogger("client");
Guid oldActivity = Trace.CorrelationManager.ActivityId;
if (oldActivity == Guid.Empty)
{
Trace.CorrelationManager.ActivityId = Guid.NewGuid();
}

using (LogManager.NDC.Push(Trace.CorrelationManager.ActivityId))
{
log.Info("Before calling WCF Service");

wcfService.Method();

log.Info("After calling WCF Service");
}
Trace.CorrelationManager.ActivityId = oldActivity;

如果将log4net / NLog日志记录格式配置为记录NDC堆栈的顶部,则客户端记录的每条消息(当 Activity 处于作用域内时)都将被“标记”为 Activity ID。假设WCF服务的实现方式类似,则在服务调用期间记录的所有消息也将被记录(尽管可能在单独的文件中)并用相同的 Activity ID进行标记。因此,将“服务”日志文件中的日志记录消息与“客户端”日志中的相应消息相关联是可能的。

因此,如果您使用WCF并有日志记录,则有一些问题:
  • 您是否使用 Activity 传播?
  • 您是否使用TraceSources进行日志记录?
  • 您是否使用其他一些日志记录平台(例如log4net,NLog)?
  • 如果您使用其他日志记录平台,那么如何进行 Activity 传播?
  • 您是否混合使用了第三方日志记录(对于大多数日志记录为log4net / NLog)和System.Diagnostics.TraceSource(对于WCF服务边界日志记录)?

  • 那ServiceTraceViewer呢?你会用吗?我看到的大多数示例都显示了System.Diagnostics通过TraceSources和XmlTraceListener生成的输出。它可以消耗log4net,NLog等的输出吗?它在基于TraceSource的日志记录中是否“最佳”工作?如果是这样,那么在WCF服务边界(捕获一些应用程序上下文以及WCF通信信息)仅包含少量基于TraceSource的日志记录以在ServiceTraceViewer中进行查看是否“足够好”?在我正在进行的WCF学习过程中,我已经简短地使用过ServiceTraceViewer。

    如果您走了这么远,谢谢阅读。也许我是在考虑日志记录,WCF Activity 传播以及在ServiceTraceViewer中查看日志的功能的整体集成。在选择日志记录平台和/或日志记录策略时,这似乎是一个重要的考虑因素,但是我对这些日志记录平台或WCF的经验不足,无法确定。

    最佳答案

    就我自己而言,我使用自己编写/维护的基于AOP的日志记录,但是就像其他一些日志记录框架一样……Mine基于装饰器,但是我可以将其扩展到调用堆栈上的所有内容。

    所以你有这样的地方:

    using (LogManager.NDC.Push(Trace.CorrelationManager.ActivityId)) {
    log.Info("Before calling WCF Service");

    wcfService.Method();

    log.Info("After calling WCF Service");
    }
    Trace.CorrelationManager.ActivityId = oldActivity;

    如果您在服务器上有类似的内容,那么我的方法可以解决此问题,但是我的方法不适用于内部日志记录。我的被​​设置为执行此操作:
    [LogMethod( CaptureDirection = LoggingDirection.InOut /*Optional*/, CaptureVariables = Yes /*Optional*/ )]
    public ClassName MyMethodName(params){
    //magic logging happens here on method entry

    DoSomething();

    //if you need logging here I can't do anything with my AOP system

    DoSomethingElse();


    //magic logging happens here on method exit
    }

    此外,您是否希望在客户端和服务器之间建立关联的日志记录?您如何协商这两个?您如何确保一个与另一个相关?

    关于wcf - 使用log4net或NLog的WCF日志记录/跟踪和事件ID传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3678827/

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