2013-10-03 5 views
3

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

Декларация:

public static void Write(string text, params object[] parameters) {} 

Использование:

if (Log.On) Log.Write("Hello", valueA, valueB, valueC); 

Так что это элегантный и чистый, на мой взгляд. Однако он имеет один большой недостаток, значения не помечены каким-либо образом. Для меня очевидным решением является такой метод:

public static void Write(string text, Dictionary<string, object> parameters) {} 

но этот метод загромождает мой код.

if (Log.On) 
{ 
Dictionary<string, object> p = new Dictionary<string, object>(); 
p.Add("valueA", valueA); 
p.Add("valueB", valueB); 
p.Add("valueC", valueC); 
Log.Write("Hello", p); 
} 

Любые идеи, как сделать этот метод максимально ненавязчивым?

+2

Посмотрите на log4net или аналогичные рамки ведения журнала. – Joe

ответ

2

Вы можете использовать это:

public static void LogValues(string text, object values) 
{ 
    var properties = values.GetType().GetProperties(); 
    Log.WriteLine(text + ": " + string.Join(", ", 
     properties.Select(property => 
     { 
      var name = property.Name; 
      var value = property.GetValue(values); 
      return name + " = " + (value != null ? value.ToString() : "null"); 
     }))); 
} 

Как это:

int x = 5; 
double y = 7.2; 
LogValues("Some message", new { y, s = "test", x }); 

Какой будет генерировать строку, как это в вашем журнале:

Some message: y = 7.2, s = test, x = 5 

Ключ здесь находится в использовании анонимный тип для параметра values. Это позволяет передавать «названные» переменные, а не только значения этих переменных.

Если вы хотите, чтобы последовательный порядок на выводах <name> = <value> был распечатан, вы можете вставить .OrderBy(property => property.Name) перед .Select(...) в запросе LINQ.

+1

Использовать Отражение каждый раз, когда вы регистрируетесь? Я буду придерживаться 'if'. –

+0

Любить это, но меня тоже беспокоит скорость, любая рационализация возможна? – Surfbutler

+1

Меня не беспокоит скорость. В моем случае запросы к базе данных являются реальными узкими местами, и по сравнению с ними некоторое отражение во время ведения журнала незначительно. – Nezreli

Смежные вопросы