由于我在 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/