باستخدام uniqueidentifiers / GUIDs كما الخصائص المخصصة في log4net

StackOverflow https://stackoverflow.com/questions/424018

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا أحاول أن إضافة خاصية مخصصة وهو ارشد، لكنه يعطيني هذا الخطأ:

<اقتباس فقرة>   

وSystem.InvalidCastException: الإضافة فشل   تحويل قيمة المعلمة من سلسلة   إلى الدليل. --->   System.InvalidCastException: الإضافة غير صالح   يلقي من "System.String" ل   "System.Guid".

وI تحديد هذا في التكوين:

<parameter>
<parameterName value="@id" />
<dbType value="Guid" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%X{id}" />
</layout>
</parameter>

والرمز الفعلي (قصاصة) الأول هو استخدام هذا:

        Guid guid = Guid.NewGuid();
        if (defaultLogger.IsEnabledFor(level))
        {
            var loggingEvent = new LoggingEvent(ThisDeclaringType,
 defaultLogger.Repository, defaultLogger.Name, level, message, exception);
            loggingEvent.Properties["Id"] = guid;

وأي مساعدة من فضلك؟ :) يتم تعريف الحقل معرف في قاعدة البيانات كما uniqueidentifier NOT NULL، لكنه لا يملك contraint المفتاح الأساسي.

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

المحلول

وعلى سبيل المثال لديك ما يلي: يجب أن تعمل:

<parameter>
<parameterName value="@Oid" />
<dbType value="Guid" />
<layout type="log4net.Layout.RawPropertyLayout">
<key value="Id" />
</layout>
</parameter>

والمهم هو إعادة تسميةid إلى شيء آخر وإلا سوف تحصل على قيم خالية في قاعدة البيانات حتى لو حاولت إدراج السلاسل،

وبعد ذلك استخدام RawPropertyLayout لتخزين وسلطات الجمارك لا تحتاج للقيام التحويل.

نصائح أخرى

على 1. تنزيل شفرة المصدر من log4.net

على 2 تغيير في FormatValue وظيفة داخل log4net.Appender.AdoNetAppender.cs ملف من هذا القبيل:.

virtual public void FormatValue(IDbCommand command, LoggingEvent loggingEvent)
        {
            // Lookup the parameter
            IDbDataParameter param = (IDbDataParameter)command.Parameters[m_parameterName];

            // Format the value
            object formattedValue = Layout.Format(loggingEvent);

            // If the value is null then convert to a DBNull
            if (formattedValue == null)
            {
                formattedValue = DBNull.Value;
            }

            if (param.DbType == System.Data.DbType.Guid)
            {
                param.Value = new Guid(formattedValue.ToString());
            }
            else
            {
                param.Value = formattedValue;
            }
        }

وبعد ذلك يعمل!

إذا كنت ترغب في الحصول على خاصية GUID للأغراض العامة، يمكنك القيام بما يلي:

    private void ConfigureLog4Net()
    {
        // adds a global custom log4net property
        log4net.GlobalContext.Properties[nameof(Guid.NewGuid)] = new NewGuidWrapper();

        // configures log4net by XML configurations from a .config file
        log4net.Config.XmlConfigurator.Configure();
    }

    private class NewGuidWrapper
    {
        // will return new GUID every time it's called
        public override string ToString() => Guid.NewGuid().ToString();
    }

وبعد ذلك يمكنك الاتصال بالفندق على النحو التالي:

<layout type="log4net.Layout.PatternLayout">
  <!-- if you want to format the layout as a GUID followed by a message  -->
  <conversionPattern value="%property{NewGuid} %m%n" />
</layout>

ويمكنك أيضا استخدام هذا النوع من التخطيط للمعلمة DB المخصص كما وصفها هنا .

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