私は自分のexeとdllのログレベルでシングルトンロガーを書いています。
Logger.h:
#define LOG CLogger::GetInstance().Log
#define LOG_PATH _T(".\\LogFile\\Logger.log")
enum eLogLevel { NONE=0, ERR, WARNING, USER, SYSTEM, DEVELOPER };
class CLogger
{
public:
//Construcor & Destructor
CLogger();
virtual ~CLogger();
//Singleton
static CLogger& GetInstance();
//For logging level preference
//Example: WARNING -> Log only ERR & WARNING messages
//Default = NONE
virtual void SetLogLevel(eLogLevel eLevel);
//Logging
virtual void Log(eLogLevel eLevelType, CString szText);
protected:
//Open & Close the log after used
virtual void CloseLog();
virtual BOOL OpenLog();
CStdioFile m_File;
CString m_szFile;
eLogLevel m_eLevel;
BOOL m_bFileOpened;
};
アイデアは、EXEプロジェクトには、ログレベルの設定を担当するLogger.cppとLogger.hを含める必要があるということです。
一方、DLLプロジェクトにはLogger.cppとLogger.hを含める必要がありますが、EXEプロジェクトのログレベルに従うため、ログレベルを設定する必要はありません。
EXEとDLLはどちらも、同じログファイルに何でも書き込むことができると期待されています。
結果は、DLLプロジェクトがログファイルに書き込めるように、DLLプロジェクトにSetLogLevel()を要求する必要があるということです。
上記のLogger.hで問題を見つけられる人はいますか?EXEとDLLは同じプロセス/スレッドで実行されるため、シングルトンはメンバー変数を含むオブジェクトの1つのインスタンスを共有しませんか?