既存のロギングライブラリを使用したくない場合は、マクロの使用を試みることができます。独自のlibを提供し、フォーマットメカニズムのようなprintfを備えたマクロで使用できるようにすることをお勧めします。
私は過去にそのようなことをしました。プラグインを介して拡張できる実際のロギングをカプセル化するログオブジェクトと呼ばれるマクロ。
しかし、私はLog4xxxによって同様のことがすでに行われていると思うので、それを見るのは良いことかもしれません。
ここに提案があります(テストする時間がありません、うまくいくことを願っています)
ヘッダ:
#ifdef _MYAPI_IMPL
#define MY_API __declspec(dllexport)
#そうしないと
#define MY_API __declspec(dllimport)
#endif
クラスMY_APIログ
{{
公衆:
列挙型レベル{エラー、警告、情報、デバッグ};
Log(レベルレベル、const char *ファイル、int行);
void operator()(const char * Format、...);
プライベート:
const char * m_file;
レベルm_level;
int 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ロガー
{{
公衆:
virtual void log(const char * message)= 0;
};
クラスMY_APILoggerManager
{{
プライベート:
static LoggerManager * s_inst;
LoggerManager(){}
仮想〜LoggerManager(){}
公衆:
static LoggerManager * Instance();
static void Clean();
addLogger(Logger * newLogger、Log :: Level minlevel = Log :: Info);
log(const char * file、int line、Log :: Level level、const char * message);
};
Cpp:
Log :: Log(レベルレベル、const char *ファイル、int行)
:m_file(file)、m_level(level)、m_line(line)
{{
}
void Log :: operator()(const char * format、...)
{{
va_list va;
va_start(va、format);
charメッセージ[LENGTH+1] = {0};
_vsnprintf(message、LENGTH、format、va);
va_end(va);
LoggerManager :: Instance()-> log(m_file、m_line、m_level、message);
};
他のlibsとexeはこのように呼び出すことができるはずです。.hを含め、libにリンクするだけです。
LOG_INF( "Hello%s!"、 "world");
更新:ロギングメカニズムに必要な説明を追加しました。1つの方法は、シングルトンを使用して、実際のロギング用にサブクラス化されるインターフェースを提供することです。
マクロを使用する利点は、ログの場所を取得できることです。これは、場合によっては非常に興味深い情報になる可能性があります。すべてのロギングメカニズムを実装したくない場合は、マクロを通常のprintfに変換することもできます。