]> git.vomp.tv Git - vompclient.git/blob - src/log.h
Switch to cmake
[vompclient.git] / src / log.h
1 /*
2     Copyright 2021 Chris Tallon
3
4     This file is part of VOMP.
5
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.
10
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.
15
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/>.
18 */
19
20 #ifndef LOGNT_H
21 #define LOGNT_H
22
23 #include <string>
24 #include <cstdarg>
25 #include <iostream>
26 #include <fstream>
27 #include <mutex>
28 #include <thread>
29 #include <iomanip>
30 #include <fmt/core.h>
31 #include <fmt/ostream.h>
32 #include <sys/time.h>
33
34 #include "defines.h"
35
36
37 class ExternLogger
38 {
39   public:
40     virtual bool LogExtern(const char* message)=0;
41 };
42
43 class LogNT
44 {
45   public:
46     LogNT();
47     ~LogNT();
48     static LogNT* getInstance();
49
50     bool init(const std::string& fileName, bool enabled);
51     void setTraceOnlyMode(bool);
52
53     enum levels { TRACE, DEBUG, INFO, WARN, ERROR, CRIT };
54
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...); }
61
62     void setExternLogger(void*) {};
63     void unsetExternLogger() {};
64
65
66     template<typename T, typename... Ts>
67     void ilog(const char* TAG, int level, T fmtString, Ts... args)
68     {
69       if (!enabled) return;
70       if (traceOnlyMode && (level != TRACE)) return;
71
72       struct timeval tv;
73       struct tm tms;
74       gettimeofday(&tv, NULL);
75       LOCALTIME_R(&tv.tv_sec, &tms);
76
77       std::lock_guard<std::mutex> lg(outLock);
78
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;
84
85       switch(level)
86       {
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;
93       }
94
95       *outstream << " " << std::hex << std::this_thread::get_id() << std::dec << " " << TAG << " - ";
96
97       try
98       {
99         fmt::print(*outstream, fmtString, args...);
100       }
101       catch (std::exception& e)
102       {
103         fmt::print(*outstream, "<<< EXCEPTION GENERATED BY THIS LOG MESSAGE >>>");
104       }
105
106
107       *outstream << std::endl;
108     }
109
110   private:
111     static LogNT* instance;
112
113     bool enabled{};
114     std::string fileName;
115     std::ofstream logFile;
116     std::mutex outLock;
117     std::ostream* outstream;
118     bool traceOnlyMode{};
119 };
120
121 #endif