我的所有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");
}
答案 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请求。当你从一个线程中创建一个线程时。'。获取父进程的安全性而不是父线程。
您有两个选择,您需要为设置为运行应用程序池的用户帐户授予其他权限,因此您具有对登录所需内容的写入权限:
或理论上你可以在每个衍生线程上使用模拟,因此它具有与其源自的线程相同的安全上下文。
http://www.justskins.com/forums/impersonation-in-a-sub-34034.html