| 74 | } |
| 75 | |
| 76 | void LogMessages(Settings settings) |
| 77 | { |
| 78 | using namespace std::chrono_literals; |
| 79 | |
| 80 | ActiveExecutorClient executor; |
| 81 | LogSources logsources(executor); |
| 82 | executor.Call([&] { |
| 83 | logsources.AddDBWinReader(false); |
| 84 | if (HasGlobalDBWinReaderRights()) |
| 85 | logsources.AddDBWinReader(true); |
| 86 | logsources.SetAutoNewLine(settings.autonewline); |
| 87 | }); |
| 88 | |
| 89 | std::ofstream fs; |
| 90 | |
| 91 | if (!settings.filename.empty()) |
| 92 | { |
| 93 | OpenLogFile(fs, WStr(settings.filename)); |
| 94 | fs.flush(); |
| 95 | } |
| 96 | |
| 97 | auto guard = make_guard([&fs, &settings]() |
| 98 | { |
| 99 | if (!settings.filename.empty()) |
| 100 | { |
| 101 | fs.flush(); |
| 102 | fs.close(); |
| 103 | std::cout << "Log file closed.\n"; |
| 104 | } |
| 105 | }); |
| 106 | |
| 107 | std::string separator = settings.tabs ? "\t" : " "; |
| 108 | while (!g_quit) |
| 109 | { |
| 110 | Lines lines; |
| 111 | executor.Call([&] { |
| 112 | lines = logsources.GetLines(); |
| 113 | }); |
| 114 | int linenumber = 0; |
| 115 | for (auto& line : lines) |
| 116 | { |
| 117 | if (settings.console) |
| 118 | { |
| 119 | if (settings.linenumber) |
| 120 | { |
| 121 | ++linenumber; |
| 122 | std::cout << std::setw(5) << std::setfill('0') << linenumber << std::setfill(' ') << separator; |
| 123 | } |
| 124 | OutputDetails(settings, line); |
| 125 | std::cout << separator << line.message.c_str() << "\n"; |
| 126 | } |
| 127 | if (!settings.filename.empty()) |
| 128 | { |
| 129 | WriteLogFileMessage(fs, line.time, line.systemTime, line.pid, line.processName, line.message); |
| 130 | } |
| 131 | } |
| 132 | if (settings.flush) |
| 133 | { |
no test coverage detected