Уровень многословия в простой реализации Logger C ++ - PullRequest
1 голос
/ 24 декабря 2011

В настоящее время я реализую простой Logger для проекта, так как я учился на C ++.

Я уже получил базовый класс Logger, так как некоторые другие приложения добавлены, и следующим шагом является реализация уровней многословия.Проблема в том, что я не уверен, правильно ли я понял концепцию уровней многословия, и поэтому я хотел получить некоторую обратную связь, прежде чем я начну их реализовывать.Таким образом, насколько я понимаю, уровень многословия в целом работает следующим образом:

Пользователь сначала создает два Logger: например:

FileLogger fl; 
VSLogger vl;

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

fl.setLoggerLevel(DEBUG);
vl.setLoggerLevel(FATAL_ERROR);

после этого он может войти в систему, как он хочет, например:

fl.logg("New Object of Type .... created");
ASSERT(1,2, "1==2");

, в то время как assert записывает в VSLogger с уровнем фатальной ошибки

и в файле Ouput это, вероятно, будет выглядеть так:

13:36 Msg: New Object of Type .... created (LEVEL:DEBUG);

и в Visual Studio это, вероятно, выглядело бы так:

13:36 Msg: Assert (1==2) failed (LEVEL:FATAL_ERROR)

Является ли это смыслом уровня многословия или я неправильно понял концепции уровня многословия в целом?

Ответы [ 2 ]

2 голосов
/ 24 декабря 2011

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

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

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

В простейшем случае я бы создал глобальную функцию Logger& GetLogger(), которая приводит к пользовательскому коду, например GetLogger().LogDebug("New Object of Type .... created");

Сначала создайте интерфейс:

public class ILogger
{
  public:
    virtual LogDebug(string message)=0;
    ...
}

Затем создайте один экземпляр, который поддерживает подписку:

public class DispatchingLogger:ILogger
{
  private:
    vector<ILogger*> loggers;
  public:
    override LogDebug(string message)
    {
      foreach(ILogger logger in loggers)
      {
        logger.LogDebug(message);
      }
    }

    void Subscribe(ILogger* logger)
    {
      loggers.add(logger);
    }
}

Затем глобальная функция GetLogger() возвращает один экземпляр DispatchingLogger. И вы можете подписать несколько реализаций с разными уровнями детализации. И пользовательские классы, которые реализуют ILogger, также могут быть зарегистрированы.

(я знаю, что мой синтаксис C ++ неправильный, немного с тех пор, как я работал с C ++)

0 голосов
/ 24 декабря 2011

Уровень многословия показывает, какие сообщения (или, скорее, какой важности) должны быть зарегистрированы.

* 1003 Е.Г. *

Set verbosity to INFO
Log a trace message  //the message will not be logged
Log a debug message  //the message will not be logged
Log an info message  //the message will be logged
Log a warning        //the message will be logged
Log an error or a fatal error.  // will be logged
...