سؤال

أنا أستخدم Log4Net وقمت بتكوين ملف XML الخاص بي لتسجيل الدخول إلى قاعدة البيانات باستخدام AdOnetAppender ويبدو أن كل شيء يعمل بشكل صحيح عندما أقوم بإنشاء التطبيق وتكوين كل شيء. ويمكنني تسجيل الدخول بنجاح إلى قاعدة البيانات. ولكن عندما أقوم بتغيير الرسالة في الكود الخاص بي ، فإنه يتوقف عن التسجيل إلى قاعدة البيانات.

هنا تكوين بلدي:

<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
  <bufferSize value="0" />
  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <connectionString value="Server=USER-PC;Integrated Security=SSPI;Initial Catalog=mydb;Trusted_Connection=true;"/>
  <commandText value="INSERT INTO Log1 ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
  <parameter>
    <parameterName value="@log_date"/>
    <dbType value="DateTime"/>
    <layout type="log4net.Layout.RawTimeStampLayout"/>
  </parameter>
  <parameter>
    <parameterName value="@thread"/>
    <dbType value="String"/>
    <size value="255"/>
    <layout type="log4net.Layout.PatternLayout">
      <converter>
        <name value="hex_thread" />
        <type value="MyWebApplication.HexPatternConverter" />
      </converter>
      <conversionPattern value="%hex_thread" />
    </layout>
    </parameter>
  <parameter>
    <parameterName value="@log_level"/>
    <dbType value="String"/>
    <size value="50"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%level"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@logger"/>
    <dbType value="String"/>
    <size value="255"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%logger"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@message"/>
    <dbType value="String"/>
    <size value="4000"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%message"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@exception"/>
    <dbType value="String"/>
    <size value="2000"/>
    <layout type="log4net.Layout.ExceptionLayout"/>
  </parameter>
</appender>

لقد وجدت ذلك عبر الإنترنت وقمت بتعديل قليل لتناسب طلبي. أفكر في أنه قد يكون ذلك لأننا ندرج في جدول Log1 قبل الحصول على المعلمات ، ربما لا أعرف حقًا لأنني جديد على XML World وأعرف القليل عنها.

إذا كان الكود الخاص بي

 private static readonly ILog dblog = LogManager.GetLogger("ADONetAppender");
 dblog.Info("logging to db");

إنه يعمل في المرة الأولى ، ثم أقوم بتغيير الرسالة مثل هذه

dblog.Info("I AM LOGGING TO DB"); 
dblog.Info("me again");

لن ينجح ذلك على الإطلاق ، فإن ملحقات الملف الخاصة بي كلها على ما يرام ، يمكنهم أخذ تغيير الرسالة ولكن AdonetAppender يرفض ذلك. لماذا يحدث هذا؟

تم تحريره لإضافة:

وظائفاتي بسيطة للغاية لدي هذا الفصل للقيام بتسجيل التسجيل:

using System; 
using System.Collections.Generic; 
using System.Linq; using System.Web;using log4net; 
using log4net.Config; using log4net.Core;
using log4net.Layout; using System.Text; 
using System.IO; 
using log4net.Layout.Pattern; 

namespace myWebApplication 
{

public sealed class HexPatternConverter : PatternLayoutConverter
{
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
    {
        long id;
        if (long.TryParse(loggingEvent.ThreadName, out id))
        {
            writer.Write(id.ToString("X"));
        }
        else
        {
            writer.Write(loggingEvent.ThreadName);
        }
    }
}

public class myClass
{
    private static readonly ILog secondlog = LogManager.GetLogger("methodB");
    private static readonly ILog thirdlog = LogManager.GetLogger("methodC");
    private static readonly ILog fourthlog = LogManager.GetLogger("methodD");
    private static readonly ILog fifthlog = LogManager.GetLogger("ADONetAppender");

    public static int methodA()
    {
        int a = 0;
        return a;
    }
    public static void methodB()
    {
        methodA();
        secondlog.Info("inside method B");
    }
    public static void methodC()
    {
        methodB();
        thirdlog.Info("inside method C");
    }

    public static void methodD()
    {
        methodC();
        fourthlog.Info("inside D");
        fifthlog.Info("this is db log");
        fifthlog.Info("this is me logging to the db");
    }
}

}

سجلات الملف على ما يرام عندما أجري تغييرات ولكن سجل DB الخاص بي لا يكتب إلى قاعدة البيانات ، لأنه عندما أحاول استرداد البيانات في الجدول الخاص بي ، لا توجد تغييرات. لست متأكدًا مما أفعله خطأ.

تكوين المسجل الخاص بي

<logger name="ADONetAppender">
<appender-ref ref="ADONetAppender"/>
</logger>
<logger name="methodB">
  <appender-ref ref="methodB"/>
</logger>
<logger name="methodC">
  <appender-ref ref="methodC"/>
</logger>
<logger name="methodD">
  <appender-ref ref="methodD"/>
</logger>
<root>     
</root>

الثلاثة الأخيرة هم RollingFileAppenderوهم يعملون بشكل مثالي ، أقوم بتغيير الرسالة أو أضيف بعض الرسائل الأخرى. إنه DB الذي يمنحني صداعًا عندما أقوم بتغيير الرسالة أو أضيف بعض الرسائل الأخرى للتسجيل.

هل كانت مفيدة؟

المحلول 2

أوه أخيرًا ، لقد نجحت بشكل جيد ... هناك بعض الشفرة التي قمت بتضمينها في Global.asax التي لا ينبغي أن تكون هناك على ما أعتقد. لقد جربت للتو Revoming the Code وعملت بشكل جيد. الآن يكتب على الفور بغض النظر عن عدد التغييرات التي أجريها.

إليك الرمز ليس لدي أي فكرة عما يفعله ، لكنني وجدته على الإنترنت. لم يكن هناك حاجة في حالتي

 log4net.Repository.Hierarchy.Hierarchy hier = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy;

        if (hier != null)
        {
            //get ADONetAppender
            log4net.Appender.AdoNetAppender adoAppender =
              (log4net.Appender.AdoNetAppender)hier.GetLogger("ADONetAppender",
                hier.LoggerFactory).GetAppender("ADONetAppender");
            if (adoAppender != null)
            {
                adoAppender.ConnectionString =
                  System.Configuration.ConfigurationSettings.AppSettings["MyConnectionString"];
                adoAppender.ActivateOptions(); //refresh settings of appender
            }

        }

وبعد أن أزلت حل مشكلة.

نصائح أخرى

أولاً: قم بتغيير حجم المخزن المؤقت إلى 1 ، وليس 0.

ثانياً: إذا كانت رسالة السجل الأولى تعمل ، فإن ملف التكوين الخاص بك جيدًا. من المحتمل أن يكون في بقية التعليمات البرمجية الخاصة بك ، أظهر لنا أكثر من ذلك بقليل.

إذا كان الأمر معقدًا ، فاختبر وظيفة بسيطة للغاية أو اثنتين ، فأخبرنا بما يحدث.

تم تحريره لإضافة

حسنًا ، أرى الكود الخاص بك ، والآن أرى ذلك HexPatternConverter يتم استخدامه لتنسيق عمود واحد: لذلك ربما يحدث خطأ ما هناك ، مثل إلقاء استثناء. أقترح أن تحاول تشغيل هذا دون استخدام تلك الفئة (فقط كتابة عمود مؤشر الترابط كسلسلة عادي) ومعرفة ما إذا كان هذا يغير أي شيء.

أيضًا ، فقط في حال لم تكن تعرف: إذا واجه Log4Net مشكلة SQL ، فسوف تفشل بصمت. هذا يبدو غير مرجح في هذه الحالة ، لأنه يكتب على الأقل سجلين ، ولكن لا يزال.

تم تحريره لإضافة

عند تغيير ملف التكوين ، يقوم IIS بإعادة تحميل التطبيق بأكمله ، لذلك ربما تنفد من الموارد. هل تمتلك آخر نشاط قاعدة البيانات؟ هل تتوقف كذلك؟ هل من الممكن أن تفتح اتصالات DB وتنسى إغلاقها؟ من شأن ذلك أن يتسبب في فشل نشاط DB حتى يعيد التطبيق.

تم تحريره لإضافة

لا يفتح ConnectionString في ملف التكوين الاتصالات ، إنه مجرد مكان يعرفه البرنامج (أو في هذه الحالة Log4Net). إذا كنت لا تقوم بأي نشاط DB إلى جانب Log4Net ، فربما لا تكون مشكلة اتصال.

الشيء التالي الذي يجب تجربته: هل لدى Log4Net هذه المشكلة مع ملحق ملف نصي؟

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