c++ - 简单记录器实现 C++ 中的详细级别

标签 c++ logging verbosity

由于我在 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 以 fatal error 级别写入 VSLogger 时

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

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

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

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

这是冗长级别的意思还是我误解了一般冗长级别的概念?

最佳答案

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

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

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

在最简单的情况下,我会创建一个全局函数 Logger& GetLogger(),它会生成类似 GetLogger().LogDebug("New Object of Type .... created ");

首先创建一个接口(interface):

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++ 以来就有点不对)

关于c++ - 简单记录器实现 C++ 中的详细级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624597/

相关文章:

c++ - CreateProcess 异常 (kernel32.lib)

r - 我怎样才能让 R 的输出更详细,以便让我放心它还没有坏?

java - Tomcat:按记录器名称过滤 log4j

python - GoogleAppEngineLauncher 在哪里保存本地日志文件?

grails - 如何在grails 2中使用 'appender-ref'设置log4j附加程序?

prolog - SICStus Prolog 垃圾收集跟踪消息

c++ - 无法打开源文件 "afxwin.h"/"afxext.h"/"afxdisp.h"/"afxdtctl.h"/"afxcmn.h"/afxdisp.h 等

c++ - 关于 char* 和 char[] 基础知识的问题

c++ - 如何使 CMake 退出非 0 以响应警告 "Manually-specified variables were not used by the project"?

java - 我的日志仅在 Google App Engine 上发出实际请求一小时后出现