bool Log::shouldLog(CallSite& site) { LogLock lock; if (!lock.ok()) { return false; } Globals& g = Globals::get(); Settings& s = Settings::get(); s.shouldLogCallCounter += 1; std::string class_name = className(site.mClassInfo); std::string function_name = functionName(site.mFunction); if (site.mClassInfo != typeid(NoClassInfo)) { function_name = class_name + "::" + function_name; } ELevel compareLevel = s.defaultLevel; checkLevelMap(s.functionLevelMap, function_name, compareLevel) || checkLevelMap(s.classLevelMap, class_name, compareLevel) || checkLevelMap(s.fileLevelMap, abbreviateFile(site.mFile), compareLevel); site.mCached = true; g.addCallSite(site); return site.mShouldLog = site.mLevel >= compareLevel; }
bool Log::shouldLog(CallSite& site) { LogLock lock; if (!lock.ok()) { return false; } AIAccess<Settings> settings_w(Settings::get()); settings_w->shouldLogCallCounter += 1; std::string class_name = className(site.mClassInfo); std::string function_name = functionName(site.mFunction); if (site.mClassInfo != typeid(NoClassInfo)) { function_name = class_name + "::" + function_name; } ELevel compareLevel = settings_w->defaultLevel; // The most specific match found will be used as the log level, // since the computation short circuits. // So, in increasing order of importance: // Default < Broad Tag < File < Class < Function < Narrow Tag ((site.mNarrowTag != NULL) ? checkLevelMap(settings_w->tagLevelMap, site.mNarrowTag, compareLevel) : false) || checkLevelMap(settings_w->functionLevelMap, function_name, compareLevel) || checkLevelMap(settings_w->classLevelMap, class_name, compareLevel) || checkLevelMap(settings_w->fileLevelMap, abbreviateFile(site.mFile), compareLevel) || ((site.mBroadTag != NULL) ? checkLevelMap(settings_w->tagLevelMap, site.mBroadTag, compareLevel) : false); site.mCached = true; AIAccess<Globals>(Globals::get())->addCallSite(site); return site.mShouldLog = site.mLevel >= compareLevel; }
bool Log::shouldLog(CallSite& site) { LogLock lock; if (!lock.ok()) { return false; } Globals& g = Globals::get(); Settings& s = Settings::get(); s.shouldLogCallCounter += 1; std::string class_name = className(site.mClassInfo); std::string function_name = functionName(site.mFunction); #if LL_LINUX // gross, but typeid comparison seems to always fail here with gcc4.1 if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name())) #else if (site.mClassInfo != typeid(NoClassInfo)) #endif // LL_LINUX { function_name = class_name + "::" + function_name; } ELevel compareLevel = s.defaultLevel; // The most specific match found will be used as the log level, // since the computation short circuits. // So, in increasing order of importance: // Default < Broad Tag < File < Class < Function < Narrow Tag ((site.mNarrowTag != NULL) ? checkLevelMap(s.tagLevelMap, site.mNarrowTag, compareLevel) : false) || checkLevelMap(s.functionLevelMap, function_name, compareLevel) || checkLevelMap(s.classLevelMap, class_name, compareLevel) || checkLevelMap(s.fileLevelMap, abbreviateFile(site.mFile), compareLevel) || ((site.mBroadTag != NULL) ? checkLevelMap(s.tagLevelMap, site.mBroadTag, compareLevel) : false); site.mCached = true; g.addCallSite(site); return site.mShouldLog = site.mLevel >= compareLevel; }
void Log::flush(std::ostringstream* out, const CallSite& site) { LogLock lock; if (!lock.ok()) { return; } Globals& g = Globals::get(); Settings& s = Settings::get(); std::string message = out->str(); if (out == &g.messageStream) { g.messageStream.clear(); g.messageStream.str(""); g.messageStreamInUse = false; } else { delete out; } if (site.mLevel == LEVEL_ERROR) { std::ostringstream fatalMessage; fatalMessage << abbreviateFile(site.mFile) << "(" << site.mLine << ") : error"; writeToRecorders(site.mLevel, fatalMessage.str()); } std::ostringstream prefix; switch (site.mLevel) { case LEVEL_DEBUG: prefix << "DEBUG: "; break; case LEVEL_INFO: prefix << "INFO: "; break; case LEVEL_WARN: prefix << "WARNING: "; break; case LEVEL_ERROR: prefix << "ERROR: "; break; default: prefix << "XXX: "; break; }; if (s.printLocation) { prefix << abbreviateFile(site.mFile) << "(" << site.mLine << ") : "; } if (message.find(functionName(site.mFunction)) == std::string::npos) { #if LL_WINDOWS // DevStudio: __FUNCTION__ already includes the full class name #else if (site.mClassInfo != typeid(NoClassInfo)) { prefix << className(site.mClassInfo) << "::"; } #endif prefix << site.mFunction << ": "; } prefix << message; message = prefix.str(); writeToRecorders(site.mLevel, message); if (site.mLevel == LEVEL_ERROR && s.crashFunction) { s.crashFunction(message); } }
void Log::flush(std::ostringstream* out, const CallSite& site) { LogLock lock; if (!lock.ok()) { return; } Globals& g = Globals::get(); Settings& s = Settings::get(); std::string message = out->str(); if (out == &g.messageStream) { g.messageStream.clear(); g.messageStream.str(""); g.messageStreamInUse = false; } else { delete out; } if (site.mLevel == LEVEL_ERROR) { std::ostringstream fatalMessage; fatalMessage << abbreviateFile(site.mFile) << "(" << site.mLine << ") : error"; writeToRecorders(site.mLevel, fatalMessage.str()); } std::ostringstream prefix; switch (site.mLevel) { case LEVEL_DEBUG: prefix << "DEBUG: "; break; case LEVEL_INFO: prefix << "INFO: "; break; case LEVEL_WARN: prefix << "WARNING: "; break; case LEVEL_ERROR: prefix << "ERROR: "; break; default: prefix << "XXX: "; break; }; if (s.printLocation) { prefix << abbreviateFile(site.mFile) << "(" << site.mLine << ") : "; } #if LL_WINDOWS // DevStudio: __FUNCTION__ already includes the full class name #else #if LL_LINUX // gross, but typeid comparison seems to always fail here with gcc4.1 if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name())) #else if (site.mClassInfo != typeid(NoClassInfo)) #endif // LL_LINUX { prefix << className(site.mClassInfo) << "::"; } #endif prefix << site.mFunction << ": "; if (site.mPrintOnce) { std::map<std::string, unsigned int>::iterator messageIter = s.uniqueLogMessages.find(message); if (messageIter != s.uniqueLogMessages.end()) { messageIter->second++; unsigned int num_messages = messageIter->second; if (num_messages == 10 || num_messages == 50 || (num_messages % 100) == 0) { prefix << "ONCE (" << num_messages << "th time seen): "; } else { return; } } else { prefix << "ONCE: "; s.uniqueLogMessages[message] = 1; } } prefix << message; message = prefix.str(); writeToRecorders(site.mLevel, message); if (site.mLevel == LEVEL_ERROR && s.crashFunction) { s.crashFunction(message); } }
void Log::flush(std::ostringstream* out, const CallSite& site) { LogLock lock; if (!lock.ok()) { return; } std::string message = out->str(); { AIAccess<Globals> globals(Globals::get()); if (out == &globals->messageStream) { globals->messageStream.clear(); globals->messageStream.str(""); globals->messageStreamInUse = false; } else { delete out; } } AIAccess<Settings> settings_w(Settings::get()); if (site.mLevel == LEVEL_ERROR) { std::ostringstream fatalMessage; fatalMessage << abbreviateFile(site.mFile) << "(" << site.mLine << ") : error"; writeToRecorders(settings_w, site.mLevel, fatalMessage.str()); } std::ostringstream prefix; switch (site.mLevel) { case LEVEL_DEBUG: prefix << "DEBUG: "; break; case LEVEL_INFO: prefix << "INFO: "; break; case LEVEL_WARN: prefix << "WARNING: "; break; case LEVEL_ERROR: prefix << "ERROR: "; break; default: prefix << "XXX: "; break; }; if (settings_w->printLocation) { prefix << abbreviateFile(site.mFile) << "(" << site.mLine << ") : "; } #if LL_WINDOWS // DevStudio: __FUNCTION__ already includes the full class name #else if (site.mClassInfo != typeid(NoClassInfo)) { prefix << className(site.mClassInfo) << "::"; } #endif prefix << site.mFunction << ": "; if (site.mPrintOnce) { std::map<std::string, unsigned int>::iterator messageIter = settings_w->uniqueLogMessages.find(message); if (messageIter != settings_w->uniqueLogMessages.end()) { messageIter->second++; unsigned int num_messages = messageIter->second; if (num_messages == 10 || num_messages == 50 || (num_messages % 100) == 0) { prefix << "ONCE (" << num_messages << "th time seen): "; } else { return; } } else { prefix << "ONCE: "; settings_w->uniqueLogMessages[message] = 1; } } if (site.mPrintOnce) { std::map<std::string, unsigned int>::iterator messageIter = settings_w->uniqueLogMessages.find(message); if (messageIter != settings_w->uniqueLogMessages.end()) { messageIter->second++; unsigned int num_messages = messageIter->second; if (num_messages == 10 || num_messages == 50 || (num_messages % 100) == 0) { prefix << "ONCE (" << num_messages << "th time seen): "; } else { return; } } else { prefix << "ONCE: "; settings_w->uniqueLogMessages[message] = 1; } } prefix << message; message = prefix.str(); writeToRecorders(settings_w, site.mLevel, message); if (site.mLevel == LEVEL_ERROR && settings_w->crashFunction) { settings_w->crashFunction(message); } }
void Log::flush(std::ostringstream* out, const CallSite& site) { LogLock lock; if (!lock.ok()) { return; } std::string message = out->str(); { AIAccess<Globals> globals(Globals::get()); if (out == &globals->messageStream) { globals->messageStream.clear(); globals->messageStream.str(""); globals->messageStreamInUse = false; } else { delete out; } } AIAccess<Settings> settings_w(Settings::get()); if (site.mLevel == LEVEL_ERROR) { std::ostringstream fatalMessage; fatalMessage << abbreviateFile(site.mFile) << "(" << site.mLine << ") : error"; writeToRecorders(settings_w, site.mLevel, fatalMessage.str()); } std::ostringstream prefix; switch (site.mLevel) { case LEVEL_DEBUG: prefix << "DEBUG"; break; case LEVEL_INFO: prefix << "INFO"; break; case LEVEL_WARN: prefix << "WARNING"; break; case LEVEL_ERROR: prefix << "ERROR"; break; default: prefix << "XXX"; break; }; bool need_function = site.mFunction; if (need_function && site.mBroadTag && *site.mBroadTag != '\0') { prefix << "(\"" << site.mBroadTag << "\")"; #if LL_DEBUG // Suppress printing mFunction if mBroadTag is set, starts with // "Plugin " and ends with "child": a debug message from a plugin. size_t taglen = strlen(site.mBroadTag); if (taglen >= 12 && strncmp(site.mBroadTag, "Plugin ", 7) == 0 && strcmp(site.mBroadTag + taglen - 5, "child") == 0) { need_function = false; } #endif } prefix << ": "; if (need_function) { if (settings_w->printLocation) { prefix << abbreviateFile(site.mFile) << "(" << site.mLine << ") : "; } #if LL_WINDOWS // DevStudio: __FUNCTION__ already includes the full class name #else if (site.mClassInfo != typeid(NoClassInfo)) { prefix << className(site.mClassInfo) << "::"; } #endif prefix << site.mFunction << ": "; } if (site.mPrintOnce) { std::map<std::string, unsigned int>::iterator messageIter = settings_w->uniqueLogMessages.find(message); if (messageIter != settings_w->uniqueLogMessages.end()) { messageIter->second++; unsigned int num_messages = messageIter->second; if (num_messages == 10 || num_messages == 50 || (num_messages % 100) == 0) { prefix << "ONCE (" << num_messages << "th time seen): "; } else { return; } } else { prefix << "ONCE: "; settings_w->uniqueLogMessages[message] = 1; } } if (site.mPrintOnce) { std::map<std::string, unsigned int>::iterator messageIter = settings_w->uniqueLogMessages.find(message); if (messageIter != settings_w->uniqueLogMessages.end()) { messageIter->second++; unsigned int num_messages = messageIter->second; if (num_messages == 10 || num_messages == 50 || (num_messages % 100) == 0) { prefix << "ONCE (" << num_messages << "th time seen): "; } else { return; } } else { prefix << "ONCE: "; settings_w->uniqueLogMessages[message] = 1; } } prefix << message; message = prefix.str(); writeToRecorders(settings_w, site.mLevel, message); if (site.mLevel == LEVEL_ERROR && settings_w->crashFunction) { settings_w->crashFunction(message); } }