2 Copyright 2021 Chris Tallon
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP. If not, see <https://www.gnu.org/licenses/>.
31 #include <fmt/ostream.h>
40 virtual bool LogExtern(const char* message)=0;
48 static LogNT* getInstance();
50 bool init(const std::string& fileName, bool enabled);
51 void setTraceOnlyMode(bool);
53 enum levels { TRACE, DEBUG, INFO, WARN, ERROR, CRIT };
55 template<typename... Ts> void trace(const char* TAG, Ts... args) { ilog(TAG, TRACE, args...); }
56 template<typename... Ts> void debug(const char* TAG, Ts... args) { ilog(TAG, DEBUG, args...); }
57 template<typename... Ts> void info (const char* TAG, Ts... args) { ilog(TAG, INFO, args...); }
58 template<typename... Ts> void warn (const char* TAG, Ts... args) { ilog(TAG, WARN, args...); }
59 template<typename... Ts> void error(const char* TAG, Ts... args) { ilog(TAG, ERROR, args...); }
60 template<typename... Ts> void crit (const char* TAG, Ts... args) { ilog(TAG, CRIT, args...); }
62 void setExternLogger(void*) {};
63 void unsetExternLogger() {};
66 template<typename T, typename... Ts>
67 void ilog(const char* TAG, int level, T fmtString, Ts... args)
70 if (traceOnlyMode && (level != TRACE)) return;
74 gettimeofday(&tv, NULL);
75 LOCALTIME_R(&tv.tv_sec, &tms);
77 std::lock_guard<std::mutex> lg(outLock);
79 *outstream << std::setfill('0')
80 << std::setw(2) << tms.tm_hour << ":"
81 << std::setw(2) << tms.tm_min << ":"
82 << std::setw(2) << tms.tm_sec << "."
83 << std::setw(6) << tv.tv_usec;
87 case TRACE: *outstream << " [trace] "; break;
88 case DEBUG: *outstream << " [debug] "; break;
89 case INFO: *outstream << " [info] "; break;
90 case WARN: *outstream << " [warn] "; break;
91 case ERROR: *outstream << " [error] "; break;
92 case CRIT: *outstream << " [CRIT] "; break;
95 *outstream << " " << std::hex << std::this_thread::get_id() << std::dec << " " << TAG << " - ";
99 fmt::print(*outstream, fmtString, args...);
101 catch (std::exception& e)
103 fmt::print(*outstream, "<<< EXCEPTION GENERATED BY THIS LOG MESSAGE >>>");
107 *outstream << std::endl;
111 static LogNT* instance;
114 std::string fileName;
115 std::ofstream logFile;
117 std::ostream* outstream;
118 bool traceOnlyMode{};