1

log4net AdoNetAppender (DB アペンダー) を使用してログをデータベースに書き込むアプリがあります。レコードを DB に書き込んでいますが、カスタム フィールドはすべて NULL です。単体テストで同じコードを使用しても問題なく動作しますが、アプリケーションの実行中に呼び出された場合は動作しません。これは、メッセージ キューからメッセージを処理するマルチスレッド アプリケーションです。

マルチスレッド アプリケーションでの DB アペンダーのカスタム プロパティに関する既知の問題 (誰もが知っている) はありますか? 単体テストなどで再現できないため、アプリをスピンアップしたときに機能しない理由については、これが私の唯一の推測です。

デフォルトのlog4netフィールドはうまくいきます。

シングルトンでカスタム プロパティの値を設定しています。

   public sealed class Logger
    {
        private static readonly Logger instance = new Logger();
        public static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


        /// <summary>
        /// Static constructor which sets the properties for the database logging using log4net. This enables analysts to view the log events
        /// inside the database as well as in the local application log file. 
        /// </summary>
        static Logger()
        {
            GlobalContext.Properties["Application"] = "MyApp";
            GlobalContext.Properties["ApplicationVersion"] = Utility.GetApplicationVersion();
            var windowsHost = System.Net.Dns.GetHostName();
            if (!String.IsNullOrEmpty(windowsHost))
                LogicalThreadContext.Properties["Host"] = windowsHost;
            //ThreadContext.Properties["LogTime"] = DateTime.Now;
            var windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
            if (windowsIdentity != null)
                GlobalContext.Properties["CreatedBy"] = windowsIdentity.Name;
        }

        private Logger()
        {

        }

        public static Logger Instance
        {
            get { return instance; }
        }
    }

編集:

これは、追加のlog4netデバッグを試して追加しようとしていることがわかりました.

http://logging.apache.org/log4net/release/faq.html#internalDebug

log4nets の内部ログにエラーが表示されないため、何が起こっているのかまだ不明です。

4

1 に答える 1

0

私はついにそれを理解しました。これは、カスタム プロパティをグローバルに設定しようとしていた方法でした。代わりに、インスタンスがキューにバインドしてメッセージを処理する前に、アプリの起動時にプロパティを設定します。それができたように見えました....なぜ最初にそれを考えなかったのかわからない. log4net GlobalContext を使用しただけで、魅力的に機能しました。

--S

于 2013-04-23T03:09:42.363 に答える