Как я могу улучшить этот механизм логирования?


Есть довольно много вещей, которые я рассматриваю:

  1. Мне придется проверить на нулевые значения
  2. У меня будут серьезные неприятности, сохраняемых в базе данных.

Как я могу улучшить это или re-фактор для лучших результатов?

public class ErrorLog
    {
        public static void LogError(Exception e)
        {
            var exceptionLog = new Dictionary<String, String>
                                   {
                                       {"Inner Exception", e.InnerException.Message},
                                       {"Message", e.Message},
                                       {"Source", e.Source},
                                       {"StackTrace", e.StackTrace},
                                       {"MethodName",e.TargetSite.Name}
                                   };
            foreach (KeyValuePair<String, String> kvp in e.Data)
                exceptionLog.Add(kvp.Key, kvp.Value);
        }
    }

Обновление с новых и более простой класс

  public class ErrorLog
    {
        public static void LogError(Exception e)
        {
            var innerExcpetionMessage = e.InnerException == null ? "Null" : e.InnerException.Message;
            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
            {                
                    var cmd = new SqlCommand("ApplicationErrorLog", connection) { CommandType = System.Data.CommandType.StoredProcedure };
                    cmd.Parameters.AddWithValue("@Type", e.GetType().Name);
                    cmd.Parameters.AddWithValue("@InnerException", innerExcpetionMessage);
                    cmd.Parameters.AddWithValue("@Message", e.Message);
                    cmd.Parameters.AddWithValue("@Source", e.Source);
                    cmd.Parameters.AddWithValue("@StackTrace", e.StackTrace);
                    cmd.Parameters.AddWithValue("@MethodName", e.TargetSite.Name);
                    connection.Open();
                    cmd.ExecuteNonQuery();
                    connection.Close();
                }

            }
        }
    }

Теперь что, если есть ошибка в обновлении этот журнал, как журнал, что?



1884
5
задан 29 октября 2011 в 09:10 Источник Поделиться
Комментарии
4 ответа

Почему бы вам серьезные неприятности с упорством?

Вобще нуль проверяет свойство innerexception и TargetSite, остальные будут вставлены как значения null или пустую строку в зависимости от настроек БД.

И почему бы просто не упростить его как:

var innerExceptionMessage = e.InnerException == null ? string.Empty : e.InnerException.Message;
var targetSiteMessage = e.TargetSite == null ? string.Empty : e.TargetSite.Message;

exceptionLog.Add("Inner Exception", innerExceptionMessage);
exceptionLog.Add("Message", e.Message);
exceptionLog.Add("Source", e.Source);
exceptionLog.Add("StackTrace", e.StackTrace);
exceptionLog.Add("MethodName",targetSiteMessage);

Сохранить его простым :)

5
ответ дан 29 октября 2011 в 12:10 Источник Поделиться

Я бы предположил несколько предложений:


  1. Во-первых, вы должны добавить код обработки исключений вашей регистрации.
    Возможно, вы не хотите, чтобы ваш код лесозаготовки повышение необработанных исключений (которые, в зависимости от того, где это происходит в коде, можно попробовать рекурсивно снова войти). По крайней мере, это даст вам возможность что-то написать о том, почему это не удалось и, возможно, включать в себя оригинальную исключением некоторых резервных копий журналов как журналы событий системы, вывода на консоль или в файл.

  2. Во-вторых, я бы реализовать базу данных журналов как класс слушателя по отдельным классом лесозаготовки. Как это в C#, вы можете взглянуть на класса tracesource класс. Ваш логгер базе будет написано продлить прослушивателя трассировки, а затем добавленные в коллекцию listeners на объект трассировки. Это дает вам свободу, чтобы добавить несколько типов слушателей, которые могут войти в различные мероприятия, каждое из которых потенциально имеющих различные фильтрации. Это даже можно сделать через приложение.файл config.

  3. Вы также можете использовать значение dbnull вместо "null" или строку.Пустых значений, которые недоступны, если ваш хранимую процедуру и лесозаготовки поддержка схемы его.

2
ответ дан 31 октября 2011 в 05:10 Источник Поделиться

Ты делаешь ужасные вещи здесь. "Новый и более простой класс" тесно соединяет вас с SQL и настойчивость проблем. Словарь строкой строка и реализации, а, скорее, основой для класса.

Было бы лучше, чтобы пойти с ваш оригинальный подход, а затем определить отдельный метод, чтобы сделать запись в базу данных, которая принимает в словаре/класса в качестве параметра.

2
ответ дан 31 октября 2011 в 07:10 Источник Поделиться

Просто быстрый комментарий на ответ @Маттиас по. Я думаю, что вы хотите захватить исходное сообщение исключение, если свойство innerexception имеет значение null. Если так, вы могли бы написать:

var innerExceptionMessage = e.InnerException == null ? string.Empty : e.InnerException.Message;

как

var innerExceptionMessage = (e.InnerException ?? e).Message ?? string.Empty;

1
ответ дан 31 октября 2011 в 08:10 Источник Поделиться