기존 로깅 lib를 사용하지 않으려면 매크로를 사용해보십시오. 나 자신의 lib를 제공하고 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와 lib에 링크를 포함시켜야합니다.
LOG_INF("Hello %s!", "world");
업데이트 : 로깅 메커니즘에 필요한 설명을 추가했습니다. 한 가지 방법은 싱글 톤을 사용하고 실제 로깅을 위해 서브 클래스화할 인터페이스를 제공하는 것입니다.
매크로를 사용하면 매크로가 로그의 위치를 파악할 수있는 이점이 있습니다.이 로그는 매우 흥미로운 정보 일 수 있습니다. 모든 로깅 메커니즘을 구현하지 않으려는 경우 매크로를 일반 printf로 설정할 수도 있습니다.
고마워, 좋은 해결책! 내 사용자 라이브러리에 사용자 로그 프로그램이 등록되지 않은 경우 기본 로깅 (예 : syslog)을 제공 할 수도 있습니다. –
예. –