gpt4 book ai didi

c++ - 如何改进这个日志方案(多一点)

转载 作者:行者123 更新时间:2023-11-28 08:25:26 24 4
gpt4 key购买 nike

基本上,我有这个记录器类和前缀器。

class Logger
{
public:
enum LogType
{
LT_DEBUG = 0,
LT_WARNING,
LT_ERROR,
LT_STAT,
LT_TEXT,
LT_INFO,
LT_OTHER,
LT_UNKNOWN
};

__attribute__((format(printf, 7, 8)))
virtual const char* EHLog(LogType, //LogType
bool, //Send to FE
int, //Error code
const char*, //File
int, //Line
const char*, //Format
...) = 0;

virtual void PushPrependString(const char*) = 0;
virtual void PopPrependString() = 0;

virtual ~Logger(){}
};

class Prepender
{
public:
Prepender(Logger& oLogger, const char* zPrependString)
:o_Logger(oLogger)
{
o_Logger.PushPrependString(zPrependString);
}

~Prepender()
{
o_Logger.PopPrependString();
}

private:
Prepender();
Prepender(const Prepender&);
Prepender& operator=(const Prepender&);

Logger& o_Logger;
};

现在,在完成任何日志记录的函数中,我这样做:

void SomeObject::SomeMethod()
{
Prepender(*p_Logger, __PRETTY_FUNCTION__);

//Do stuff
}

效果很好。

有没有什么方法可以通过在我需要记录的地方手动创建一个 Prepender 对象来改善这一点? (甚至宏?)(我确实理解这可能是不可能的,我想知道其他人有什么想法)。

编辑:正如我看到很多人有错误的想法,我最想这样做:

void SomeObject::SomeMethod()
{
//Prepender(*p_Logger, __PRETTY_FUNCTION__);

//Do stuff
//And the same results!!!
}

这样做的主要动机是确保我不会忘记在函数中进行日志记录时为其添加前缀。如果我这样做了,报告的功能将比真实功能高出一个级别。

最佳答案

编辑2:

基于修改后的 OP 中的编辑,IMO 至少无法实现以便携方式登录的预期目标。

编辑1:

  1. 你不想支持宽字符吗?
  2. 为什么不使用字符串 (wstring) 而不是 char*?
  3. Logger 应该是 Singleton 或 Monostate(应该处理与在每个函数入口创建它相关的挑战)
  4. 这是否要求线程安全?
  5. 为什么不在 Logger 中使用纯虚拟析构函数?
  6. 名字记录器看起来不对。它应该指示类似 LogInterface 等的内容。
  7. 异常处理怎么样?

在您告诉我们规范之前,我可以继续进行更多操作!

关于c++ - 如何改进这个日志方案(多一点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4212451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com