]> git.vomp.tv Git - vompclient.git/blob - src/log.h
Implement Log shutdown
[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 shutdown();
52     void setTraceOnlyMode(bool);
53
54     enum levels { TRACE, DEBUG, INFO, WARN, ERROR, CRIT };
55
56     template<typename... Ts> void trace(const char* TAG, Ts... args) { ilog(TAG, TRACE, args...); }
57     template<typename... Ts> void debug(const char* TAG, Ts... args) { ilog(TAG, DEBUG, args...); }
58     template<typename... Ts> void info (const char* TAG, Ts... args) { ilog(TAG, INFO,  args...); }
59     template<typename... Ts> void warn (const char* TAG, Ts... args) { ilog(TAG, WARN,  args...); }
60     template<typename... Ts> void error(const char* TAG, Ts... args) { ilog(TAG, ERROR, args...); }
61     template<typename... Ts> void crit (const char* TAG, Ts... args) { ilog(TAG, CRIT,  args...); }
62
63     void setExternLogger(void*) {};
64     void unsetExternLogger() {};
65
66
67     template<typename T, typename... Ts>
68     void ilog(const char* TAG, int level, T fmtString, Ts... args)
69     {
70       if (!enabled) return;
71       if (traceOnlyMode && (level != TRACE)) return;
72
73       struct timeval tv;
74       struct tm tms;
75       gettimeofday(&tv, NULL);
76       LOCALTIME_R(&tv.tv_sec, &tms);
77
78       std::lock_guard<std::mutex> lg(outLock);
79
80       *outstream << std::setfill('0')
81         << std::setw(2) << tms.tm_hour << ":"
82         << std::setw(2) << tms.tm_min  << ":"
83         << std::setw(2) << tms.tm_sec << "."
84         << std::setw(6) << tv.tv_usec;
85
86       switch(level)
87       {
88         case TRACE: *outstream << " [trace] "; break;
89         case DEBUG: *outstream << " [debug] "; break;
90         case INFO:  *outstream << " [info]  "; break;
91         case WARN:  *outstream << " [warn]  "; break;
92         case ERROR: *outstream << " [error] "; break;
93         case CRIT:  *outstream << " [CRIT]  "; break;
94       }
95
96       *outstream << " " << std::hex << std::this_thread::get_id() << std::dec << " " << TAG << " - ";
97
98       try
99       {
100         fmt::print(*outstream, fmtString, args...);
101       }
102       catch (std::exception& e)
103       {
104         fmt::print(*outstream, "<<< EXCEPTION GENERATED BY THIS LOG MESSAGE >>>");
105       }
106
107
108       *outstream << std::endl;
109     }
110
111   private:
112     static LogNT* instance;
113
114     bool enabled{};
115     std::string fileName;
116     std::ofstream logFile;
117     std::mutex outLock;
118     std::ostream* outstream;
119     bool traceOnlyMode{};
120 };
121
122 #endif