Как записать исключение в файл? - PullRequest
13 голосов
/ 07 июня 2010

Я хочу иметь возможность вести запись в каждом блоке catch.Примерно так.

catch (Exception exception)
{
  Logger.Write(exception);
}

, а затем параметры в конфигурации выберут свойство Message и StackTrace и т. Д. С помощью прослушивателя клиента.

Я хотел бы использовать блок приложения ведения журнала Enterprise Library.Я уверен, что кто-то уже сделал это.

Ответы [ 4 ]

31 голосов
/ 07 июня 2010

Другие опубликовали несколько хороших ссылок о том, как работает Блок приложения ведения журнала (LAB), поэтому я не буду повторять это здесь.

С точки зрения форматирования вашего исключения, у меня есть 3 варианта:

  1. Используйте реализацию по умолчанию Exception.ToString() (это неплохо)
  2. Напишите пользовательский форматировщик, который интегрируется в LAB.
  3. Написать вспомогательную функцию, которая выполняет форматирование и передает строку в метод Write.

Если вариант 1 не удовлетворяет вашим потребностям, я бы рекомендовал перейти к варианту 3 (поскольку вариант 2 является избыточным).

Простой пример будет выглядеть примерно так:

    catch (Exception exception)
    {
        Logger.Write(LogHelper.CreateExceptionString(exception));
    }

    ...

    public static string CreateExceptionString(Exception e)
    {
        StringBuilder sb = new StringBuilder();
        CreateExceptionString(sb, e, String.Empty);

        return sb.ToString();
    }

    private static void CreateExceptionString(StringBuilder sb, Exception e, string indent)
    {
        if (indent == null)
        {
            indent = String.Empty;
        }
        else if (indent.Length > 0)
        {
            sb.AppendFormat("{0}Inner ", indent);
        }

        sb.AppendFormat("Exception Found:\n{0}Type: {1}", indent, e.GetType().FullName);
        sb.AppendFormat("\n{0}Message: {1}", indent, e.Message);
        sb.AppendFormat("\n{0}Source: {1}", indent, e.Source);
        sb.AppendFormat("\n{0}Stacktrace: {1}", indent, e.StackTrace);

        if (e.InnerException != null)
        {
            sb.Append("\n");
            CreateExceptionString(sb, e.InnerException, indent + "  ");
        }
    }
4 голосов
/ 07 июня 2010

Microsoft предоставила подробное руководство по этому вопросу здесь: Разработка приложений с использованием блока приложения ведения журнала

Стоит познакомиться с тем, что они говорят, потому что он достаточно мощный.

Если вы хотите что-то более приземлённое, в этой статье блога приведены некоторые рабочие примеры: Как настроить и использовать блок приложения ведения журнала

Если после прочтения у вас все еще возникают проблемы, отредактируйте свое сообщение с более подробной информацией о том, в чем проблема.

1 голос
/ 16 июня 2013

@ iSid Это то, что вы просите

public static void printException(Exception ex){
                Console.WriteLine("HelpLink = {0}", ex.HelpLink);
                Console.WriteLine("Message = {0}", ex.Message);
                Console.WriteLine("Source = {0}", ex.Source);
                Console.WriteLine("StackTrace = {0}", ex.StackTrace);
                Console.WriteLine("TargetSite = {0}", ex.TargetSite);

            }
0 голосов
/ 07 июня 2010

Вам необходимо добавить соответствующий прослушиватель для текстовых файлов - см. этот пост, его для ASP.NET, но файлы конфигурации работают одинаково для всех приложений.

...