【问题标题】:.Net logger that support hierarchy and thread safety.Net 记录器,支持层次结构和线程安全
【发布时间】:2015-02-22 20:26:01
【问题描述】:

我有两个 dll。两者都在使用 log4Net 和 log。

第一个 Dll 'A.dll' 有一个异步函数,可以并行记录,并且每个调用都有一个唯一的 ID。 此函数正在使用第二个 dll 'B.dll' 也记录。

logger.Log("Is about to enter B function");
B.somefucntion();

问题是我有多个来自“A.dll”和“B.dll”的日志,我无法在它们之间建立连接。

我无法将函数的唯一 ID 发送到“B.dll”(这是我无法修改的外部 dll)。

我想到了一个解决方案,其中在“A.dll”中打开一个范围,并且此范围之间的每个日志都将添加到此范围下+它的消息。

logger.Log("Is about to enter B function");
using (logger.Scope("Bla bla " + id))
{
   B.somefucntion();
}

然后在“B.dll”中出现的每个日志都将以“Bla bla + {id}”开头。 我已经实现了它并且它正在工作。

这个解决方案的问题是它不是线程安全的,所以多个线程可以一起改变当前的作用域。因此范围作为没有意义。

您知道另一种解决方案,已经实施/我需要实施吗?

非常感谢。

【问题讨论】:

  • @dotctor 不必要的评论,问题非常清楚。但是感谢社区的编辑,非常感谢。

标签: c# multithreading logging


【解决方案1】:

查看 log4net 上下文。 它们允许以编程方式向您的日志添加和删除属性:http://logging.apache.org/log4net/release/manual/contexts.html

特别是看一下 ThreadContext。

布局可以访问上下文属性以呈现消息。

【讨论】:

  • 谢谢!这正是我想要的
  • 有时我有多个线程层次结构有没有办法到达父线程并将所有属性存储在那里?
  • 很抱歉,AFAIK 没有:没有简单的方法。一种通用方法是使用关联令牌:您的请求/层次结构的 ID,可让您“关联”日志条目。
【解决方案2】:

如果您真的想要出色的可追溯性和层次结构,请尝试 ReflectInsight。 https://insightextensions.codeplex.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多