void FileLogChannel::pushLog(int64_t, std::string *timestamp, const std::string &line, const char*, int, const char *methodName, short logSection, short) { if (m_fileout) { if (timestamp) { FileWriteStr(*timestamp, m_fileout); FileWriteStr(" ", m_fileout); } if (m_printSection && logSection) { FileWriteStr("[", m_fileout); const std::string section = Log::Manager::sectionString(logSection); if (section.empty()) { std::ostringstream num; num << logSection; FileWriteStr(num.str() , m_fileout); } else { FileWriteStr(section , m_fileout); } FileWriteStr("] ", m_fileout); } if (m_printMethodName && methodName) { std::string m(shortenMethod(methodName)); if (!m.empty()) { FileWriteStr(m , m_fileout); FileWriteStr(") " , m_fileout); } } FileWriteStr(line, m_fileout); if (line.empty() || line.back() != '\n') FileWriteStr("\n", m_fileout); } }
bool OpenDebugLog() { boost::call_once(&DebugPrintInit, debugPrintInitFlag); boost::mutex::scoped_lock scoped_lock(*mutexDebugLog); assert(fileout == nullptr); assert(vMsgsBeforeOpenLog); fs::path pathDebug = GetDebugLogPath(); fileout = fsbridge::fopen(pathDebug, "a"); if (!fileout) { return false; } setbuf(fileout, nullptr); // unbuffered // dump buffered messages from before we opened the log while (!vMsgsBeforeOpenLog->empty()) { FileWriteStr(vMsgsBeforeOpenLog->front(), fileout); vMsgsBeforeOpenLog->pop_front(); } delete vMsgsBeforeOpenLog; vMsgsBeforeOpenLog = nullptr; return true; }
void BCLog::Logger::LogPrintStr(const std::string &str) { std::string strTimestamped = LogTimestampStr(str); if (m_print_to_console) { // print to console fwrite(strTimestamped.data(), 1, strTimestamped.size(), stdout); fflush(stdout); } if (m_print_to_file) { std::lock_guard<std::mutex> scoped_lock(m_file_mutex); // buffer if we haven't opened the log yet if (m_fileout == nullptr) { m_msgs_before_open.push_back(strTimestamped); } else { // reopen the log file, if requested if (m_reopen_file) { m_reopen_file = false; m_fileout = fsbridge::freopen(m_file_path, "a", m_fileout); if (!m_fileout) { return; } setbuf(m_fileout, nullptr); // unbuffered } FileWriteStr(strTimestamped, m_fileout); } } }
void OpenDebugLog() { boost::call_once(&DebugPrintInit, debugPrintInitFlag); boost::mutex::scoped_lock scoped_lock(*mutexDebugLog); assert(fileout == NULL); assert(vMsgsBeforeOpenLog); fs::path pathDebug = GetDataDir() / "debug.log"; fileout = fsbridge::fopen(pathDebug, "a"); if (fileout) { setbuf(fileout, NULL); // unbuffered // dump buffered messages from before we opened the log while (!vMsgsBeforeOpenLog->empty()) { FileWriteStr(vMsgsBeforeOpenLog->front(), fileout); vMsgsBeforeOpenLog->pop_front(); } } delete vMsgsBeforeOpenLog; vMsgsBeforeOpenLog = NULL; }
bool BCLog::Logger::OpenDebugLog() { std::lock_guard<std::mutex> scoped_lock(m_file_mutex); assert(m_fileout == nullptr); assert(!m_file_path.empty()); m_fileout = fsbridge::fopen(m_file_path, "a"); if (!m_fileout) { return false; } setbuf(m_fileout, nullptr); // unbuffered // dump buffered messages from before we opened the log while (!m_msgs_before_open.empty()) { FileWriteStr(m_msgs_before_open.front(), m_fileout); m_msgs_before_open.pop_front(); } return true; }
int LogPrintStr(const std::string &str) { int ret = 0; // Returns total number of characters written static std::atomic_bool fStartedNewLine(true); std::string strTimestamped = LogTimestampStr(str, &fStartedNewLine); if (fPrintToConsole) { // print to console ret = fwrite(strTimestamped.data(), 1, strTimestamped.size(), stdout); fflush(stdout); } else if (fPrintToDebugLog) { boost::call_once(&DebugPrintInit, debugPrintInitFlag); boost::mutex::scoped_lock scoped_lock(*mutexDebugLog); // buffer if we haven't opened the log yet if (fileout == nullptr) { assert(vMsgsBeforeOpenLog); ret = strTimestamped.length(); vMsgsBeforeOpenLog->push_back(strTimestamped); } else { // reopen the log file, if requested if (fReopenDebugLog) { fReopenDebugLog = false; fs::path pathDebug = GetDebugLogPath(); if (fsbridge::freopen(pathDebug,"a",fileout) != nullptr) setbuf(fileout, nullptr); // unbuffered } ret = FileWriteStr(strTimestamped, fileout); } } return ret; }