ThreadContext الملكية لا يكتب لAdoNetAppender
-
03-07-2019 - |
سؤال
وأستخدمه log4net 1.2.10.0. لقد مددت ILOG وLogManager لتشمل مستوى جديد، "المراجعة". أريد أن استخدام AdoNetAppender
لتسجيل %message
إلى قاعدة بيانات. أحتاج معلومات أخرى سجلت وحاولت استخدام log4net.ThreadContext.Properties
.
وأحصل على أي نتيجة عند محاولة استخدام خاصية السياق كقيمة لمعلمة SQL.
<log4net>
<level>
<name value="AUDIT" />
<value value="35000" />
</level>
<appender name="AdoNetAppender.Audit" type="log4net.Appender.AdoNetAppender">
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="AUDIT" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=db1;User ID=user;Password=pass" />
<commandText value="INSERT INTO table1 VALUES(:custom_prop, :message)" />
<parameter>
<parameterName value=":custom_prop" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{custom_prop}" />
</layout>
</parameter>
<parameter>
<parameterName value=":message" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="AdoNetAppender.Audit" />
</root>
</log4net>
ووتنفيذ التعليمات البرمجية هو (تم init'ed افتراض log4net ومسجل، "تسجيل"، تم إنشاء).
log4net.ThreadContext.Properties["custom_prop"] = "value";
log.Audit("a message");
ووappender يعمل مع مرشح AUDIT إذا أنا بجد رمز قيمة بدلا من استخدام المعلمة SQL.
...
<commandText value="INSERT INTO table1 VALUES('value', :message)" />
...
ووappender يعمل مع الخاصية السياق إذا أنا تصفية على المدمج في مستوى، مثل INFO.
...
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="INFO" />
</filter>
...
وA FileAppender
يعمل مع مرشح AUDIT والسياق الممتلكات!
<appender name="FileAppender" type="log4net.Appender.FileAppender" >
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="AUDIT" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<file value="test.log" />
<layout type="log4net.Layout.PatternLayout" >
<conversionPattern value="%-5level [%property{custom_prop}] - %message%newline" />
</layout>
</appender>
والناتجة في
AUDIT [value] - a message
<ع> استخدام خاصية السياق العالمي يعمل مع AdoNetAppender
وAUDIT التصفية. ولكن، I need الموضوع قرار السياق.
log4net.GlobalContext.Properties["custom_prop"] = "value";
log.Audit("a message");
والناتجة في
table1
custom_prop message
=========== =======
value a message
وهكذا، أنا لا أعرف ما اذا كان وجود مشكلة في AdoNetAppender
أو دروسي الموسعة أو التكوين بلدي.
المحلول
وكان سبب المشكلة الإجهاض المبكر للموضوع المقدمة. أعتقد أن log4net تشغيل عملية التزامن. وضع النوم في نهاية التطبيق اختبار إصلاح المشكلة
...
log4net.ThreadContext.Properties["custom_prop"] = "value";
log.Audit("a message");
...
Thread.Sleep(1000);
و، أو عندما تكون في موضوع مستقل، والانضمام على ذلك
Thread t = new Thread(new ThreadStart(delegate
{
log4net.ThreadContext.Properties["custom_prop"] = "value";
log.Audit("a message");
}));
t.Start();
...
t.Join();
في التشغيل العادي، يجب أن يكون log4net ما يكفي من الوقت بين كل دعوة AUDIT وانتهاء التنفيذ.