【问题标题】:Why is Log4Net not recording log statements in my separate thread?为什么 Log4Net 不在我的单独线程中记录日志语句?
【发布时间】:2011-10-18 20:27:47
【问题描述】:

我的所有 log4net 附加程序都已在我的 Web 应用程序中设置并正常工作,但是当我启动不同的线程来启动数据同步过程时,该单独线程中的所有日志语句都进入了空的深渊;我的 appender 都没有被解雇。有人知道为什么会这样吗?

private static readonly ILog Log = LogManager.GetLogger("mylog");

public static string SomeValue
{
  get
  {
    Log.Debug("This WILL be appended to the log");

    var thread = new Thread(SyncData);
    thread.Start();

    return "the value";
  }
}

private static void SyncData()
{
  Log.Debug("This will NOT be appended to log");

  var newLog = LogManager.GetLogger("mylog");
  newLog.Debug("This will also NOT be appended to the log");
}

【问题讨论】:

    标签: c# asp.net-mvc multithreading log4net


    【解决方案1】:

    您应该启用 Log4net 内部调试并查看 log4net 是否报告出现问题。

    查看“如何启用 log4net 内部调试?” this link 中的部分。

    【讨论】:

    • 这有助于指出问题所在。我的一个附加程序依赖于HttpContext.Current,事后看来,HttpContext.Current 在从 Web 应用程序线程产生的新线程中为 NULL。
    【解决方案2】:

    一种可能的解决方案,可以使用创建者的身份来模拟所有手动创建的线程,如本文所示:Thread Not Working in AspNet when deployed to IIS

    我希望这对我很有用!

    亚历杭德罗。

    【讨论】:

      【解决方案3】:

      当您在 ASP.Net 应用程序中生成一个新线程时,它将在 App Pool 的用户名下运行(新线程与运行您的 Web 应用程序的进程具有相同的安全上下文,即 AppPool)。而当前正在处理您的页面的 webApp 线程可能正在不同的用户帐户下运行;您正在模拟的帐户或您定义为在匿名访问下运行的帐户。 IIS 为您提供的线程与您创建的任何线程之间存在这种安全差异的原因是:

      我们有一个应用程序池(在单个帐户下运行),它可能通过单独的线程处理多个 Web 请求,这些线程都在不同的帐户下运行。当你从一个线程中创建一个线程时,它是 .'。获取父进程而不是父线程的安全性。

      您有两个选择,要么需要为设置为运行应用程序池的用户帐户授予额外权限,因此您对需要登录的任何内容都具有写入权限:

      Thread permissions in ASP.NET

      或者从理论上讲,您可以在每个衍生线程上使用模拟,这样它就具有与它起源的线程相同的安全上下文。

      http://www.justskins.com/forums/impersonation-in-a-sub-34034.html

      【讨论】:

      • 我只是尝试快速调试它以查看两个线程在哪些用户和安全上下文下运行:var user = WindowsIdentity.GetCurrent().Name; 这对两个线程产生了相同的结果...您确定所有线程都在w3wp进程不一定在同一个用户下运行?
      • 我很抱歉,我发誓我过去看到过这种行为,因为我有类似的问题。也许这只适用于 IIS6 msdn.microsoft.com/en-us/library/ms526063(v=vs.90).aspx
      • 我希望你是对的 :) 但看起来两者的安全上下文是相同的。我知道您可以定义要处理应用程序池的进程数,其中此应用程序仅设置为一个。处理 Web 应用程序的多个进程可能会导致安全性成为更多问题
      • 同上,看到你的问题并跳了起来,我很确定,因为几年前我遇到了非常相似的事情。但所见即所得。祝你好运。
      猜你喜欢
      • 1970-01-01
      • 2012-03-26
      • 2011-10-20
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多