سؤال

وأستخدمه 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 وانتهاء التنفيذ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top