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