سؤال

هل من الممكن تسجيل خصائص الاستثناء مع NLOG؟

على سبيل المثال ، يحتوي SocketException على خصائص مثل ErrorCode و Hresult و NativeerRorCode ، وما إلى ذلك ، وهي خاصة فقط بهذا النوع من الاستثناءات. من الممكن تسجيلها دون تسجيل صريح (أي دون استخدام Log(e.ErrorCode)) لهم واستخدام errorexception فقط من الكود؟ الافتراضي عارض تخطيط الاستثناء فقط يدعو tostring على الاستثناء.

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

المحلول

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

[LayoutRenderer("ExtendedException")]
    public class ExtendedExceptionLayoutRenderer : ExceptionLayoutRenderer
    {
        protected override void Append(System.Text.StringBuilder builder, LogEventInfo logEvent)
        {
            base.Append(builder, logEvent);

            var exception = logEvent.Exception;
            if (exception is SocketException)
            {
                var sockException = (SocketException) exception;
                builder.Append(sockException.ErrorCode).Append(" ").Append(sockException.SocketErrorCode);
            }
        }
    }

معالجة SocketException ليست متطورة للغاية. أنا متأكد من أن هناك طريقة أفضل ، ولكنه يوضح كيف يمكنك القيام بذلك.

لتفعيل أنه يتعين عليك ضبط التكوين الخاص بك مثل هذا:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <extensions>
        <add assemblyFile="YourAssembly.dll"/>
    </extensions>

    <targets>
        <target name="console" xsi:type="Console" layout="${extendedexception} ${message}"/>
    </targets>

    <rules>
        <logger name="*" minlevel="Debug" writeTo="console" />
    </rules>
</nlog>

تعديل

حسنًا ، لم أكن أدرك أنك تريد هذه الميزة لكل استثناء له خصائص خاصة بها. إذا لم يكن هناك سوى عدد قليل من الآخرين الذين تهتم بهم ، فيمكنك فقط إضافة المزيد إذا (الاستثناء هو yourexceptiontype) وضبط الخصائص التي تهتم بها. نهج أكثر عاما هو استخدام الانعكاس لتسجيل جميع الخصائص المحددة عليها الاستثناء.

[LayoutRenderer("ExtendedException")]
    public class ExtendedExceptionLayoutRenderer : ExceptionLayoutRenderer
    {
        protected override void Append(System.Text.StringBuilder builder, LogEventInfo logEvent)
        {
            var exception = logEvent.Exception;
            var type = exception.GetType();
            var properties = type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);

            var logEntries = new SortedDictionary<string, string>();

            foreach (var property in properties)
            {
                var name = property.Name;
                var value = property.GetValue(exception, null).ToString();
                logEntries.Add(name, value);
            }

            foreach (var entry in logEntries)
            {
                builder.AppendFormat("{0}: {1} ", entry.Key, entry.Value);
            }

            base.Append(builder, logEvent);
        }
    }

هذا يضيف كل خاصية يتم إعلانها في نوع الاستثناء بالترتيب الأبجدي إلى إخراج السجل.

نصائح أخرى

لست على دراية بـ NLOG ، ولكن هل من الممكن أن ألتقط الاستثناء في كتلة المحاولة / الإمساك ثم رمي استثناء جديد من نوعك الخاص ، مما يتجاوز tostring لإخراج البيانات التي تهتم بها في نوع الاستثناء الجديد؟

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

كان تفكيري الآخر هو تمديد وتجاوز tostring من SocketException ، لكنني لا أعتقد أن هذا ممكن في C#.

تسلسل الاستثناء وتسجيل الدفق الناتج؟

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