लॉगिंग सेटअप मैं काफी समान है: अपने लॉगिंग अक्षम है
bool ShouldLog(const char* file, size_t line, Priority prio);
class LoggerOutput : public std::stringstream {
public:
LoggerOutput(const char* file, size_t line, Priority prio)
: prio(prio)
{
Prefix(file, line, prio);
}
void Prefix(const char* file, size_t line, Priority prio);
~LoggerOutput() {
Flush();
}
void Flush();
private:
Priority prio;
};
#define LOG(Prio) if (!Logging::ShouldLog(__FILE__, __LINE__, Prio)) {} else Logging::LoggerOutput(__FILE__, __LINE__, Prio)
हैं, तो ostream कभी नहीं बनाई गई है और बहुत कम भूमि के ऊपर मौजूद है। आप फ़ाइल नाम & लाइन नंबर (प्राथमिकताएं) या प्राथमिकता स्तर पर लॉगिंग कॉन्फ़िगर कर सकते हैं। कंसलॉग फ़ंक्शन इनवोकेशन के बीच बदल सकता है, ताकि आप आउटपुट को थ्रॉटल या सीमित कर सकें। लॉग आउटपुट स्वयं को संशोधित करने के लिए दो फ़ंक्शंस का उपयोग करता है, उपसर्ग जो "फ़ाइल: लाइन: (पीआरआईओ)" लाइन में उपसर्ग जोड़ता है, और फ्लश() जो दोनों इसे एकल आउटपुट के रूप में लॉग आउटपुट में फ़्लश करता है और इसमें एक नई लाइन जोड़ता है । मेरे कार्यान्वयन में यह हमेशा करता है, लेकिन यदि आप पहले से मौजूद नहीं हैं तो आप उस सशर्त बना सकते हैं।
मुझे आश्चर्य है कि आप #define my_macro (blah) {std :: ostringstream oss कर सकते हैं; ओएसएस ब्लाह; ThreadSafeLogging (oss.str()); } –
यह भी देखें: https://stackoverflow.com/questions/4446484/a-line-based-thread-safe-stdcerr-for-c –