【发布时间】:2010-11-18 07:14:39
【问题描述】:
基本上,我有这个记录器类和前缀。
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!!!
}
这样做的主要动机是确保在其中完成日志记录时我不会忘记为函数添加前缀。如果我这样做了,报告的功能将比真实的高一级。
【问题讨论】:
-
您不能说明您想要达到的目标吗?您希望客户端代码如何显示?
-
@Simone:"有什么办法可以通过在需要记录的地方手动创建
Prepender对象来改善这一点?" ? -
我改变了主意:可以做到:)
标签: c++