Если вы не хотите использовать существующую библиотеку журналов, вы можете попробовать использовать макросы. Я бы порекомендовал предоставить свою собственную библиотеку и сделать ее доступной с макросами с механизмом форматирования типа printf.
Я делал что-то подобное в прошлом. Макрос вызвал объект журнала, который инкапсулирует реальное ведение журнала, которое можно было расширить с помощью плагина.
Но я думаю, что что-то подобное уже сделано Log4xxx, так что, возможно, стоит посмотреть на это.
Вот предложение (извините, нет времени для тестирования, я надеюсь, что оно работает)
Заголовок:
#ifdef _MYAPI_IMPL
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif
class MY_API Log
{
public:
enum Level {Error, Warning, Info, Debug};
Log(Level level, const char* file, int line );
void operator()(const char* Format, ... );
private:
const char* m_file;
Level 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)
class My_API Logger
{
public:
virtual void log(const char* message)=0;
};
class MY_API LoggerManager
{
private:
static LoggerManager* s_inst;
LoggerManager() {}
virtual ~LoggerManager() {}
public:
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(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, format);
char message[LENGTH+1]={0};
_vsnprintf(message, LENGTH, format, va);
va_end(va);
LoggerManager::Instance()->log(m_file, m_line, m_level, message);
};
Другие libs и exe должны быть в состоянии звонить так. Они просто должны включить .h и ссылку на библиотеку.
LOG_INF("Hello %s!", "world");
Обновление: я добавил объяснение, необходимое для механизма регистрации. Одним из способов является использование синглтона и предоставление интерфейса, который будет разделен на подклассы для фактической регистрации.
Преимущество использования макросов заключается в том, что они дают вам возможность найти местоположение журнала, что может быть очень интересной информацией в некоторых случаях.
Также возможно превратить макросы в обычный printf, если вы не хотите реализовывать весь механизм ведения журнала.