为什么Log4Net不在我的单独线程中记录日志语句?

时间:2011-10-18 20:27:47

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

我的所有log4net appender都在我的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");
}

3 个答案:

答案 0 :(得分:3)

您应该启用Log4net内部调试,看看log4net是否报告出错。

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

答案 1 :(得分:1)

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

我希望这对我来说非常有用!

亚历。

答案 2 :(得分:0)

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

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

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

Thread permissions in ASP.NET

或理论上你可以在每个衍生线程上使用模拟,因此它具有与其源自的线程相同的安全上下文。

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