void FileLogger::prepareFormat(char * buf, size_t size, const Logger::Level level, const char* format) { char timestr[64]; if (print_time_) { struct tm tm; time_t t; time(&t); localtime_r(&t, &tm); strftime(timestr, sizeof(timestr) - 1, "[%Y/%m/%d %T]", &tm); } std::string level_str; if (print_level_) { level_str = levelToString(level); } if (print_time_ && print_level_) { snprintf(buf, size - 1, "%s %s: %s\n", timestr, level_str.c_str(), format); } else if (print_time_) { snprintf(buf, size - 1, "%s %s\n", timestr, format); } else if (print_level_) { snprintf(buf, size - 1, "%s: %s\n", level_str.c_str(), format); } else { snprintf(buf, size - 1, "%s\n", format); } buf[size - 1] = '\0'; }
Stream& get(const Level& level) { std::time_t time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); char foo[24]; if (0 < strftime(foo, sizeof(foo), "[%z %T]", std::localtime(&time))) { buffer_ << foo << "[" << std::this_thread::get_id() << "][" << levelToString(level) << "] "; } return buffer_; }
void writeLog(char* origin, WARNLEVEL level, char* message) { if (origin == NULL) { origin = "???"; } if (message == NULL) { message = ""; } printf("[%s] [%s] %s\n", levelToString(level), origin, message); return; }
std::string Logging::getHeader(LoggingLevel level) { auto now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); char timeStr[20]; #ifdef JET_WINDOWS tm time; localtime_s(&time, &now); strftime(timeStr, sizeof(timeStr), "%F %T", &time); #else strftime(timeStr, sizeof(timeStr), "%F %T", std::localtime(&now)); #endif char header[256]; snprintf(header, sizeof(header), "[%s] %s ", levelToString(level).c_str(), timeStr); return header; }
void Log::logDirect(LogLevel level, const char *file, int line, const QString &msg) { if (!canLog(level)) { return; } char prettyFile[40]; // truncated file name truncateFileName(prettyFile, 40, file); QString header = "%1 | %2 | %3 | %4\n"; QString logLine = header.arg(levelToString(level)).arg(prettyFile).arg(line, 4).arg(msg); this->write(logLine); if (level == LogLevel::Fatal) { abort(); } }
String CtrlrLog::formatMessage(const CtrlrLogMessage &m, const bool includeLevel, const bool includeTimestamp) { String ret; if (includeLevel) ret << levelToString (m.level); if (includeTimestamp) ret << timeToString (m.time); ret << ": "; if (m.message.endsWith("\n")) { ret << m.message.substring(1); } else { ret << m.message; } return (ret); }
void Logger::write(const QDateTime& timeStamp, LogLevel logLevel, const char* file, int line, const char* function, const char* category, const QString& message, bool fromLocalInstance) { Q_D(Logger); QMutexLocker locker(&d->loggerMutex); QString logCategory = QString::fromLatin1(category); if (logCategory.isNull() && !d->defaultCategory.isNull()) logCategory = d->defaultCategory; bool wasWritten = false; bool isGlobalInstance = this == globalInstance(); bool linkedToGlobal = isGlobalInstance && d->categories.value(logCategory, false); if (!logCategory.isNull()) { QList<AbstractAppender*> appenders = d->categoryAppenders.values(logCategory); if (appenders.length() == 0) { if (logCategory != d->defaultCategory && !linkedToGlobal && !fromLocalInstance) std::cerr << "No appenders assotiated with category " << qPrintable(logCategory) << std::endl; } else { foreach (AbstractAppender* appender, appenders) appender->write(timeStamp, logLevel, file, line, function, logCategory, message); wasWritten = true; } } // the default category is linked to the main logger appenders // global logger instance also writes all linked categories to the main appenders if (logCategory.isNull() || logCategory == d->defaultCategory || linkedToGlobal) { if (!d->appenders.isEmpty()) { foreach (AbstractAppender* appender, d->appenders) appender->write(timeStamp, logLevel, file, line, function, logCategory, message); wasWritten = true; } else { static bool noAppendersWarningShown = false; if (!noAppendersWarningShown) { #if defined(Q_OS_ANDROID) __android_log_write(ANDROID_LOG_WARN, "Logger", "No appenders registered with logger"); #else std::cerr << "No appenders registered with logger" << std::endl; #endif noAppendersWarningShown = true; } } } // local logger instances send category messages to the global instance if (!logCategory.isNull() && !isGlobalInstance) globalInstance()->write(timeStamp, logLevel, file, line, function, logCategory.toLatin1(), message, true); if (!wasWritten && !fromLocalInstance) { // Fallback #if defined(Q_OS_ANDROID) QString result = QString(QLatin1String("<%2> %3")).arg(AbstractStringAppender::stripFunctionName(function)).arg(message); __android_log_write(AndroidAppender::androidLogPriority(logLevel), "Logger", qPrintable(result)); #else QString result = QString(QLatin1String("[%1] <%2> %3")).arg(levelToString(logLevel), -7) .arg(AbstractStringAppender::stripFunctionName(function)).arg(message); std::cerr << qPrintable(result) << std::endl; #endif } if (logLevel == Logger::Fatal) abort(); }
QString VisualLog::MessageInfo::expand(const QString &pattern) const{ QString base = ""; QDateTime dt = stamp(); QString::const_iterator it = pattern.begin(); while ( it != pattern.end() ){ if ( *it == QChar('%') ){ ++it; if ( it != pattern.end() ){ char c = it->toLatin1(); switch(c){ case 'p': { if ( m_location && !m_location->remote.isEmpty() ) base += m_location->remote + "> "; base += QString().sprintf( "%0*d-%0*d-%0*d %0*d:%0*d:%0*d.%0*d %s %s@%d: ", 4, dt.date().year(), 2, dt.date().month(), 2, dt.date().day(), 2, dt.time().hour(), 2, dt.time().minute(), 2, dt.time().second(), 3, dt.time().msec(), qPrintable(levelToString(m_level).toLower()), qPrintable(sourceFunctionName()), sourceLineNumber() ); break; } case 'r': base += sourceRemoteLocation(); break; case 'F': base += sourceFileName(); break; case 'N': base += extractFileNameSegment(sourceFileName()); break; case 'U': base += sourceFunctionName(); break; case 'L': base += QString::number(sourceLineNumber()); break; case 'V': base += levelToString(m_level); break; case 'v': base += levelToString(m_level).toLower(); break; case 'w': base += QDate::shortDayName(dt.date().dayOfWeek()); break; case 'W': base += QDate::longDayName(dt.date().dayOfWeek()); break; case 'b': base += QDate::shortMonthName(dt.date().month()); break; case 'B': base += QDate::longMonthName(dt.date().month()); break; case 'd': base += QString().sprintf("%0*d", 2, dt.date().day() ); break; case 'e': base += QString().sprintf("%d", dt.date().day() ); break; case 'f': base += QString().sprintf("%*d", 2, dt.date().day() ); break; case 'm': base += QString().sprintf("%0*d", 2, dt.date().month() ); break; case 'n': base += QString().sprintf("%d", dt.date().month() ); break; case 'o': base += QString().sprintf("%*d", 2, dt.date().month() ); break; case 'y': base += QString().sprintf("%0*d", 2, dt.date().year() % 100 ); break; case 'Y': base += QString().sprintf("%0*d", 4, dt.date().year() ); break; case 'H': base += QString().sprintf("%0*d", 2, dt.time().hour() ); break; case 'I': { int hour = dt.time().hour(); base += QString().sprintf("%0*d", 2, (hour < 1 ? 12 : (hour > 12 ? hour - 12 : hour))); break; } case 'a': base += QString().sprintf(dt.time().hour() < 12 ? "am" : "pm" ); break; case 'A': base += QString().sprintf(dt.time().hour() < 12 ? "AM" : "PM" ); break; case 'M': base += QString().sprintf("%0*d", 2, dt.time().minute()); break; case 'S': base += QString().sprintf("%0*d", 2, dt.time().second() ); break; case 's': base += QString().sprintf("%0*d.%0*d", 2, dt.time().second(), 3, dt.time().msec() ); break; case 'i': base += QString().sprintf("%0*d", 3, dt.time().msec() ); break; case 'c': base += QString().sprintf("%d", dt.time().msec() / 100 ); break; default: base += *it; } } } else { base += *it; } ++it; } return base; }
void Logger::log(const LogLevel& level, const std::string& message) { os << getCurrentDateTime() << "\t " << levelToString(level) << "\t " << message << std::endl; }