void LogMessages(Settings settings) { LogSources sources(true); sources.AddDBWinReader(false); if (HasGlobalDBWinReaderRights()) sources.AddDBWinReader(true); sources.SetAutoNewLine(settings.autonewline); std::ofstream fs; if (!settings.filename.empty()) { OpenLogFile(fs, WStr(settings.filename)); fs.flush(); } auto guard = make_guard([&fs, &settings]() { if (!settings.filename.empty()) { fs.flush(); fs.close(); std::cout << "Log file closed.\n"; } }); std::string separator = settings.tabs ? "\t" : " "; while (!g_quit) { auto lines = sources.GetLines(); int linenumber = 0; for (auto it = lines.begin(); it != lines.end(); ++it) { if (settings.console) { if (settings.linenumber) { ++linenumber; std::cout << std::setw(5) << std::setfill('0') << linenumber << std::setfill(' ') << separator; } OutputDetails(settings, *it); std::cout << separator << it->message.c_str() << "\n"; } if (!settings.filename.empty()) { WriteLogFileMessage(fs, it->time, it->systemTime, it->pid, it->processName, it->message); } } if (settings.flush) { std::cout.flush(); fs.flush(); } Sleep(250); } std::cout.flush(); }
void FileWriter::Run() { //todo: we need locking on Logfile, think of ClearLog() size_t writeIndex = 0; for (;;) { while (writeIndex < m_logfile.Count()) { auto msg = m_logfile[writeIndex]; ++writeIndex; WriteLogFileMessage(m_ofstream, msg.time, msg.systemTime, msg.processId, msg.processName, msg.text); } m_ofstream.flush(); std::this_thread::sleep_for(std::chrono::seconds(1)); } }