C# 使用nlog记录多线程

C# 使用nlog记录多线程,c#,multithreading,logging,nlog,C#,Multithreading,Logging,Nlog,我在我的项目中使用nlog记录器 我的程序根据从SQLServer获取的数据生成xml文件。我正在和普林克一起做这件事。但我还必须记录跟踪信息,以便能够对prod环境中的异常情况进行一些调查 当结果日志来自多个线程时,它看起来很糟糕。例如: Operation 1 started Deserializing XXX Operation 2 started Deserializing XXX finished with status X Filling XXX with data from Z D

我在我的项目中使用nlog记录器

我的程序根据从SQLServer获取的数据生成xml文件。我正在和普林克一起做这件事。但我还必须记录跟踪信息,以便能够对prod环境中的异常情况进行一些调查

当结果日志来自多个线程时,它看起来很糟糕。例如:

Operation 1 started
Deserializing XXX
Operation 2 started
Deserializing XXX finished with status X
Filling XXX with data from Z
Deserializing YYY....
这只是平行度2

我希望看到这样的结果:

Operation 1 started
Deserializing XXX
Deserializing XXX finished with status X
Filling XXX with data from Z
Operation 1 finished
Operation 2 started    
Deserializing YYY....
我看到了一些解决方案,但它们看起来不够好:

  • 将日志数据保存到某个缓冲区,并在并行任务结束时刷新它——我应该将上下文传递给所有内部方法(看起来很糟糕!)

  • 为日志消息添加某种前缀,以帮助获取某些消息的上下文-我必须将前缀传递给每个内部消息(看起来也很糟糕)


  • 对于这个问题有一些干净的解决方案吗?

    在NLog配置文件中,有
    ${threadid}
    语法。像这样使用它:

    Operation 1 started
    Deserializing XXX
    Deserializing XXX finished with status X
    Filling XXX with data from Z
    Operation 1 finished
    Operation 2 started    
    Deserializing YYY....
    
    
    
    更多信息:


    我在生产中使用过它,而且通常都很有效。它并不完美,但所有操作(我记录的)都是按顺序进行的,这个
    threadid
    描述了哪个操作在哪个threadid中。

    我认为按照事件的实际顺序记录可能对错误检测非常有价值,因为多线程环境中的典型错误当然是,一些意想不到的事件顺序。但是为什么不在日志消息前面加一个线程名/ID呢?日志记录可以通过线程中的接口进行引导(无论如何这是个好主意),该接口可以将前缀添加到实际消息中。通过这种方式,您可以始终对日志进行后期处理,以查看与特定线程相关的所有消息。我认为缓冲是一种值得怀疑的日志记录策略,因为导致灾难性错误的事件可能永远不会写入日志。您是否可以将所有日志写入并发队列,然后在另一个线程上退出队列?这是一个独立的xml填充过程,因此在这种情况下,我不必保存顺序。但它有非常复杂的域逻辑——所以我必须在特定的线程中保存顺序,因为通过来自许多不同线程的一堆日志进行调查对我来说将是一场噩梦。是的,我可以使用ThreadId,但我必须使用一些分组和排序过滤btw@Enigmativity它看起来很有趣,你能详细描述一下吗?它的解决方案简单明了,但需要添加一些过滤和排序工具。如果没有额外的文本处理,大量的混合ID将无济于事。我认为这个变量是保留的:)你想创建一个好的日志文件查看器吗?这是另一层,需要很多工具来完成。我的问题是如何避免它。threadid是int类型的,对于那些想知道的人来说。