шаблон для входа с использованием корпоративной библиотеки - PullRequest
5 голосов
/ 29 июля 2010

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

//define this in MyClass
private static readonly ILog log = LogManager.GetLogger(typeof(MyClass));
//and than in the methods you can call it like this 
log.Info("info message");

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

Единственный пример библиотеки журналов в основном таков:

LogEntry logEntry = new LogEntry();
logEntry.EventId = 100;
logEntry.Priority = 2;
logEntry.Message = "Informational message";
logEntry.Categories.Add("Trace");
logEntry.Categories.Add("UI Events");
Logger.Write(logEntry);

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

спасибо almir

Ответы [ 2 ]

4 голосов
/ 10 августа 2010

Ваш вопрос касается одной из «проблем» Enterprise Library. Конечно, это просто работает (обычно с некоторыми головными болями конфигурации), но если вы хотите что-то с некоторой структурой, это не так. Кроме того, от Microsoft нет особых указаний.

Вот что я бы сделал:

  • Я бы добавил фасад в блок ведения журнала, который позволит вам контролировать, как вы хотите регистрировать ваши данные. то есть, если вы не хотите, чтобы разработчики создавали свои собственные категории, попросите ваш фасад взять перечисление (вы можете пометить его как Flags, чтобы разрешить несколько категорий).

  • Я бы избавился от Приоритета, так как я не думаю, что он покупает слишком много, учитывая, что у вас также есть Фильтр серьезности и категории.

  • Вы также можете добавить перегрузки для поддержки исключений и ValidationResults (если вы используете блок приложения проверки).

  • Еще одна функция, которую вы можете захотеть добавить, - добавить имя класса в качестве категории для поддержки ведения журнала для определенных классов. Вы можете либо попросить разработчиков передать имя класса, либо вы можете определить его с помощью отражения. Я предпочитаю передавать его.

Так что вы можете сделать что-то вроде этого:

[Flags]
public enum EventDataTypeCategory 
{     
    None = 0x0,   
    Failure = 0x1,
    Error = 0x2 ,
    Warning = 0x4,
    Information = 0x8,
    Debug = 0x10,
    Trace = 0x20,
    UIEvents = 0x40,
    DataAccess = 0x80
}

public static void LogMessage(string message, string className, int eventId, 
    EventDataTypeCategory categories)
{
    // Create LogEntry
    LogEntry logEntry = new LogEntry(...);

    // Add all categories
    foreach (EventDataTypeCategory enumValue in System.Enum.GetValues(typeof(EventDataTypeCategory )))
    {
        if ((enumValue & categories) == enumValue )
        {
            logEntry.Categories.Add(enumValue.ToString());
        }
    }

    if (className != null)
    {
        logEntry.Categories.Add(className);
    }

    ...

    Logger.Write(logEntry);
}

Тогда вы могли бы назвать это так:

public class MyClass
{
    private static readonly string ClassName = typeof(MyClass).FullName;

    public void DoSomething()
    {
        MyLogger.LogMessage("I'm going to DoSomething now!",
            ClassName, 
            1001, 
            EventDataTypeCategory.Trace | EventDataTypeCategory.UIEvents);
    }
}

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

0 голосов
/ 29 июля 2010

На самом деле не отвечаю на ваш вопрос, но в итоге я создал собственную систему регистрации.

Единственное, что вам нужно сделать, это:

Log.Instance.Add("This is a message");

Все другие более сложные способы использования выполняются другими методами или с перегрузками, например:

Log.Instance.AddFormat("My favourite number is {0}", 42);

Или

Log.Instance.Add("This is an important message", LogLevel.Critical);

Честно говоря, мне все еще приходится сталкиваться со случаем, когда все чрезмерные сложности ведения журналов Log4Net и Enterprise действительно необходимы или желательны.

Для получения дополнительной информации см. Мой профиль (входит в библиотеку SixPack )

...