Свойства исключения журнала - PullRequest
4 голосов
/ 22 ноября 2010

Можно ли регистрировать свойства исключения с помощью NLog?

Например, SocketException имеет такие свойства, как ErrorCode, HResult, NativeErrorCode и т. Д., Которые относятся только к исключениям этого типа.Можно зарегистрировать их без явной регистрации (то есть без использования Log(e.ErrorCode)) их и используя только ErrorException из кода?По умолчанию Средство визуализации макета исключений просто вызывает ToString для исключения.

Ответы [ 3 ]

3 голосов
/ 22 ноября 2010

Не знаю, очень ли это хорошая идея, но вы можете написать свой собственный LayoutRenderer. Для простоты я просто написал тот, который наследуется от ExceptionLayoutRenderer, и переопределил метод Append.

[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>

Редактировать

Хорошо, я не знал, что вы хотите эту функцию для каждого исключения, которое имеет свои собственные свойства. Если вас интересует лишь несколько других, вы можете просто добавить еще if (исключение - 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);
        }
    }

Это добавляет каждое свойство, объявленное для типа исключения в алфавитном порядке, к выводу журнала.

1 голос
/ 22 ноября 2010

Я не знаком с NLog, но возможно ли перехватить исключение в блоке try / catch и затем сгенерировать новое исключение вашего собственного типа, переопределив ToString для вывода данных, которые вас интересуют, в ваш новый тип исключения

Это может несколько нарушить трассировку, поэтому вам, вероятно, придется включить информацию трассировки из исходного исключения в выходные данные ToString, но это может быть достаточно просто.

Моя другая мысль состояла в том, чтобы расширить и переопределить ToString SocketException, но я не верю, что это возможно в C #.

0 голосов
/ 22 ноября 2010

Сериализировать исключение и записать полученный поток?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...