2011-10-18 4 views
2

ウェブアプリケーション内ですべてのlog4netアペンダーをセットアップして正常に動作していますが、別のスレッドを設定してデータ同期プロセスを開始すると、そのスレッド内のすべてのログステートメントが空のアビシスに入ります。私のアペンダーは誰も解雇されません。だれかがそれがなぜだろうという手がかりを持っていますか?Log4Netは別のスレッドにログステートメントを記録しないのはなぜですか?

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

あなたはlog4netの内部デバッグを有効にしてlog4netのは間違って何かを報告しているかどうかを確認する必要があります。

「log4netの内部デバッグを有効にするにはどうすればよいですか」を確認してください。 this linkのセクションそれは私にしたように、私は、これは非常に有用であることを願っていThread Not Working in AspNet when deployed to IIS

+0

これは問題の解決に役立ちました。私のアペンダの1人は、 'HttpContext.Current'に頼っていました。そして、HttpContext.Currentは、Webアプリケーションスレッドから生成された新しいスレッドでNULLになっています。 –

0

あなたはそれが新しいスレッドはすなわち、あなたのWebアプリケーションを実行しているプロセスと同じセキュリティコンテキストを持っている(アプリケーションプールの名の下で実行されますASP.Netアプリケーションに新たな新しいスレッドを生成するときAppPool)。現在あなたのページを処理しているwebAppのスレッドが別のユーザーアカウントで実行されている可能性がありますが、あなたが偽装しているアカウントか、匿名アクセスで実行するように定義したアカウント。 IISが提供するスレッドとこのセキュリティの違いは、次のとおりです。

単一のアプリケーションプール(単一のアカウントで実行されている)は、別々のスレッドを介して多数のWeb要求を処理している可能性があります。異なるアカウントで実行しています。あなたがスレッド内からスレッドを作成するときはそれを '。親スレッドではなく親プロセスのセキュリティを利用します。

はあなたがアプリケーションプールを実行するように設定されているユーザーアカウントに追加のアクセス許可を与える必要がありますいずれか、2つの選択肢がありますので、あなたは、あなたがにログインするために必要なものへの書き込み権限を持っている:

Thread permissions in ASP.NET

または理論的には、各スポーンされたスレッドで偽装を使用できるため、元のスレッドのセキュリティコンテキストと同じセキュリティコンテキストを持ちます。

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

+0

2つのスレッドが実行していたユーザーとセキュリティコンテキストを確認するためにすぐにデバッグしようとしました: 'var user = WindowsIdentity.GetCurrent()。Name;'これにより、両方のスレッドで同じ結果が得られました。 w3wpプロセスのすべてのスレッドが必ずしも同じユーザーの下で実行されているとは限りませんか? –

+0

私の謝罪私は似たような問題があったので、私は過去にこの行動を見たことを誓っています。おそらく、これはIIS6にのみ当てはまりますhttp://msdn.microsoft.com/en-us/library/ms526063(v=vs.90).aspx – JonAlb

+0

私はあなたが正しかったと思っていました:)しかし、セキュリティ・コンテキスト両方とも同じです。私はあなたがアプリケーションプールを処理するプロセスの数を定義できることを知っています。このアプリケーションは1つにのみ設定されています。 Webアプリケーションを扱う複数のプロセスでセキュリティが問題になることもあります。 –

1

可能な解決策、この記事に示すように、作成者のIDを使用して、すべててmanualy作成されたスレッドを偽装することができます!

アレハンドロ。