如果您不想使用现有的日志库,可以尝试使用宏。我建议提供您自己的库,并使其与带有 printf 格式机制的宏一起使用。
我过去做过类似的事情。该宏称为日志对象,它封装了可以通过插件扩展的真实日志记录。
但我认为 Log4xxx 已经完成了类似的事情,所以也许看看它是件好事。
这是一个建议(抱歉没有时间测试,我希望它有效)
标题:
#ifdef _MYAPI_IMPL
#define MY_API __declspec(dllexport)
#别的
#define MY_API __declspec(dllimport)
#万一
MY_API 类日志
{
上市:
枚举级别 {错误、警告、信息、调试};
Log(Level level, const char* file, int line );
void operator()(const char* 格式, ... );
私人的:
const char* m_file;
级别 m_level;
诠释 m_line;
};
#define __LOG(lvl) (Log(lvl, __FILE__, __LINE__ ))
#define LOG_ERR __LOG(Log::Error)
#define LOG_WRN __LOG(Log::Warning)
#define LOG_INF __LOG(Log::Info)
#define LOG_DBG __LOG(Log::Debug)
My_API 记录器类
{
上市:
虚拟无效日志(常量字符*消息)=0;
};
MY_API LoggerManager 类
{
私人的:
静态 LoggerManager* s_inst;
记录器管理器() {}
虚拟 ~LoggerManager() {}
上市:
静态 LoggerManager* Instance();
静态无效清洁();
addLogger(Logger* newLogger, Log::Level minlevel = Log::Info);
log(const char* file, int line, Log::Level level, const char* message);
};
价格:
Log::Log(Level level, const char* file, int line)
: m_file(file), m_level(level), m_line(line)
{
}
void Log::operator()(const char* format, ... )
{
va_list va;
va_start(va, 格式);
字符消息[LENGTH+1]={0};
_vsnprintf(消息,长度,格式,va);
va_end(va);
LoggerManager::Instance()->log(m_file, m_line, m_level, message);
};
其他库和 exe 应该能够像这样调用。他们只需要包含 .h 并与库链接。
LOG_INF("你好 %s!", "world");
更新:我添加了日志机制所需的解释。一种方法是使用单例并提供一个接口,以便为实际日志记录子类化。
使用宏的好处是它使您能够获取日志的位置,这在某些情况下可能是非常有趣的信息。当您不想实现所有日志记录机制时,也可以将宏转换为常规 printf。