यदि आप मौजूदा लॉगिंग lib का उपयोग नहीं करना चाहते हैं, तो आप मैक्रोज़ का उपयोग करने का प्रयास कर सकते हैं। मैं आपकी खुद की lib प्रदान करने और प्रारूपण तंत्र जैसे printf के साथ मैक्रोज़ के साथ उपलब्ध कराने की सलाह दूंगा।
मैंने पहले ऐसा कुछ किया है। मैक्रो ने एक लॉग ऑब्जेक्ट कहा जो वास्तविक लॉगिंग को समाहित करता है जो प्लगइन के माध्यम से विस्तार करना संभव था।
लेकिन मुझे लगता है कि लॉग 4xxx द्वारा कुछ ऐसा ही किया जा चुका है, तो शायद इसे देखना अच्छा लगे।
#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");
अद्यतन: मैंने लॉगिंग तंत्र के लिए आवश्यक स्पष्टीकरण जोड़ा है। एक तरीका है सिंगलटन का उपयोग करना और वास्तविक लॉगिंग के लिए उप-वर्गीकृत होने के लिए इंटरफ़ेस प्रदान करना।
मैक्रोज़ का उपयोग करने का लाभ यह है कि यह आपको लॉग के स्थान को प्राप्त करने की क्षमता देता है जो कुछ मामलों में बहुत ही रोचक जानकारी हो सकती है। जब आप सभी लॉगिंग तंत्र को लागू नहीं करना चाहते हैं तो मैक्रोज़ को नियमित प्रिंटफ़ में बदलना भी संभव है।
धन्यवाद, अच्छा समाधान! मैं डिफ़ॉल्ट libging (उदा। Syslog) भी प्रदान कर सकता हूं यदि मेरे lib में कोई उपयोगकर्ता-लॉगर पंजीकृत नहीं था। –
हां। –