【发布时间】:2011-12-24 12:45:47
【问题描述】:
由于我学习 C++,我目前正在为一个项目实现一个简单的 Logger。
我已经有了一个 Logger 基类,作为一些不同的附加程序,下一步是实现详细级别。 问题是我不确定我是否正确理解了详细程度的概念,所以我想在开始实施它们之前得到一些反馈。 因此,据我了解,一般工作的详细程度如下:
用户首先创建两个 Logger: f.e.:
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)
这是详细程度的含义还是我误解了详细程度的一般概念?
【问题讨论】:
-
详细程度通常会告诉您的记录器实际记录了 多少。您在这里描述的是日志级别。通常你有一个记录器,在每个日志的基础上指定日志级别,并且可以设置实际记录的日志级别。
-
谢谢。我想我理解你的意思(我实际上在研究时在其他一些网站上发现了几乎相同的定义)但我不明白的是:记录器不能自己记录东西(至少如果它没有以某种方式硬编码) .因此,如果用户想要记录某些内容并为其提供日志级别,则始终必须调用 logg 函数。那么记录器如何区分他记录的内容和不记录的内容呢?我必须说只记录至少 ERROR 级别的内容吗?如果是这样,我为什么还要记录与 INFO 级别相关的内容,而不是记录器从不记录它们?
-
例如,您调用
logger.verbosity(INFO | WARNING | DEBUG);,只有这三个级别被实际记录,您只需检查log函数中的详细程度标志:void log(unsigned level, char const* msg){ if(!(verbosity_flag & level)) return; /* else log it */ } -
啊,我明白了。谢谢你。我现在将尝试首先实现所有内容,如果仍有不清楚的地方或我认为可能可以做得更好,可能会在几天后返回代码
-
@Xeo:我会避免使用掩码来表示详细程度。记录器中的常见实现是每个日志级别包括更高级别。也就是说,如果您将日志级别设置为
INFO,您会自动期望看到任何WARN和ERROR消息,但不会看到DEBUG,而这通常通过将级别映射到数字和比较:if (log_level >= msg_level ) return;(如果我们配置为记录WARN(比如 2)并获得级别为INFO(比如 3)的消息,则不要记录)