1

由于我学习 C++,我目前正在为一个项目实现一个简单的 Logger。

我已经有了一个 Logger 基类,作为一些不同的附加程序,下一步是实现详细级别。问题是我不确定我是否正确理解了详细程度的概念,所以我想在开始实施它们之前得到一些反馈。因此,据我了解,一般工作的详细程度如下:

用户首先创建两个 Logger:fe:

FileLogger fl; 
VSLogger vl;

之后,他可以设置详细程度,例如:

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

之后他可以随心所欲地记录,例如:

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

而断言写入具有致命错误级别的 VSLogger

在输出文件中,它可能看起来像这样:

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

在 Visual Studio 中,它可能看起来像这样:

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

这是详细程度的感觉还是我误解了详细程度的概念?

4

2 回答 2

2

我不明白为什么用户必须使用两个记录器。消费代码不应该关心日志记录目标。

另一个问题是您的消费代码不会在任何地方传递严重性。每当您调用日志记录功能时,您都会传递严重性。消费代码不关心当前的详细程度是什么,它只是传递一个严重性并依赖于记录器的实现来了解严重性是否超过了详细程度。(此规则有一个例外,您可以检查详细级别以避免在高性能代码中创建日志消息的开销)

我宁愿有一个记录器作为用户,带有两个附加的输出,它们可能具有不同的详细级别。

在最简单的情况下,我会创建一个全局函数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++ 以来一直有一点)

于 2011-12-24T13:21:33.943 回答
0

详细级别显示要记录哪些消息(或者更确切地说,是什么严重性)。

例如

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
于 2011-12-24T13:16:28.283 回答