La configuration de l'exploitation forestière j'est assez similaire:
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)
Si votre enregistrement est désactivé, le ostream est jamais créé et peu existe au-dessus. Vous pouvez configurer la consignation sur le nom de fichier & numéro (s) de ligne ou niveaux de priorité. La fonction ShouldLog peut changer entre les invocations, vous pouvez donc limiter ou limiter la sortie. La sortie du journal utilise deux fonctions pour se modifier, Préfixe qui ajoute un préfixe "file: line: (PRIO)" à la ligne, et Flush() qui le renvoie à la sortie du journal en une seule commande et y ajoute un retour à la ligne . Dans ma mise en œuvre, c'est toujours le cas, mais vous pouvez rendre cela conditionnel si on n'en est pas déjà là.
Je me demande si vous pouvez faire #define my_macro (bla) {std :: ostringstream oss; bla d'Oss; ThreadSafeLogging (oss.str()); } –
Voir aussi: https://stackoverflow.com/questions/4446484/a-line-based-thread-safe-stdcerr-for-c –