1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker
23*35ffd701SAndroid Build Coastguard Worker #include "GmmLog.h"
24*35ffd701SAndroid Build Coastguard Worker
25*35ffd701SAndroid Build Coastguard Worker #if GMM_LOG_AVAILABLE
26*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
27*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLogger.h"
28*35ffd701SAndroid Build Coastguard Worker
29*35ffd701SAndroid Build Coastguard Worker #if _WIN32
30*35ffd701SAndroid Build Coastguard Worker #include <process.h>
31*35ffd701SAndroid Build Coastguard Worker #include <memory>
32*35ffd701SAndroid Build Coastguard Worker #else
33*35ffd701SAndroid Build Coastguard Worker #include <stdio.h>
34*35ffd701SAndroid Build Coastguard Worker #include <sys/stat.h>
35*35ffd701SAndroid Build Coastguard Worker #include <unistd.h>
36*35ffd701SAndroid Build Coastguard Worker #include <fstream>
37*35ffd701SAndroid Build Coastguard Worker #include <linux/limits.h>
38*35ffd701SAndroid Build Coastguard Worker #endif
39*35ffd701SAndroid Build Coastguard Worker
40*35ffd701SAndroid Build Coastguard Worker /// Logger instance shared by all of GmmLib within a process
41*35ffd701SAndroid Build Coastguard Worker #if(_DEBUG || _RELEASE_INTERNAL)
42*35ffd701SAndroid Build Coastguard Worker GmmLib::Logger &GmmLoggerPerProc = GmmLib::Logger::CreateGmmLogSingleton();
43*35ffd701SAndroid Build Coastguard Worker #endif
44*35ffd701SAndroid Build Coastguard Worker
45*35ffd701SAndroid Build Coastguard Worker #if _WIN32
46*35ffd701SAndroid Build Coastguard Worker namespace spdlog
47*35ffd701SAndroid Build Coastguard Worker {
48*35ffd701SAndroid Build Coastguard Worker namespace sinks
49*35ffd701SAndroid Build Coastguard Worker {
50*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
51*35ffd701SAndroid Build Coastguard Worker /// class defines a sink which prints the messages to the debugger
52*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
53*35ffd701SAndroid Build Coastguard Worker class Debugger : public sink
54*35ffd701SAndroid Build Coastguard Worker {
log(const details::log_msg & msg)55*35ffd701SAndroid Build Coastguard Worker void log(const details::log_msg &msg) override
56*35ffd701SAndroid Build Coastguard Worker {
57*35ffd701SAndroid Build Coastguard Worker OutputDebugString(GMM_PREFIX_STR);
58*35ffd701SAndroid Build Coastguard Worker OutputDebugString(msg.formatted.str().c_str());
59*35ffd701SAndroid Build Coastguard Worker }
60*35ffd701SAndroid Build Coastguard Worker
flush()61*35ffd701SAndroid Build Coastguard Worker void flush()
62*35ffd701SAndroid Build Coastguard Worker {
63*35ffd701SAndroid Build Coastguard Worker }
64*35ffd701SAndroid Build Coastguard Worker };
65*35ffd701SAndroid Build Coastguard Worker }
66*35ffd701SAndroid Build Coastguard Worker }
67*35ffd701SAndroid Build Coastguard Worker #endif
68*35ffd701SAndroid Build Coastguard Worker
69*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
70*35ffd701SAndroid Build Coastguard Worker /// Initializes Gmm Logger
71*35ffd701SAndroid Build Coastguard Worker ///
72*35ffd701SAndroid Build Coastguard Worker /// @return true if initialized successfully. false otherwise
73*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmLogInit()74*35ffd701SAndroid Build Coastguard Worker bool GmmLib::Logger::GmmLogInit()
75*35ffd701SAndroid Build Coastguard Worker {
76*35ffd701SAndroid Build Coastguard Worker std::string LogFilePath;
77*35ffd701SAndroid Build Coastguard Worker std::string ProcPath;
78*35ffd701SAndroid Build Coastguard Worker std::string ProcName;
79*35ffd701SAndroid Build Coastguard Worker int Pid = 0;
80*35ffd701SAndroid Build Coastguard Worker
81*35ffd701SAndroid Build Coastguard Worker // Get logging method
82*35ffd701SAndroid Build Coastguard Worker #if _WIN32
83*35ffd701SAndroid Build Coastguard Worker uint32_t regkeyVal = 0;
84*35ffd701SAndroid Build Coastguard Worker if(Utility::GmmUMDReadRegistryFullPath(GMM_LOG_REG_KEY_SUB_PATH, GMM_LOG_TO_FILE, ®keyVal))
85*35ffd701SAndroid Build Coastguard Worker {
86*35ffd701SAndroid Build Coastguard Worker LogMethod = regkeyVal ? ToFile : ToOSLog;
87*35ffd701SAndroid Build Coastguard Worker }
88*35ffd701SAndroid Build Coastguard Worker
89*35ffd701SAndroid Build Coastguard Worker if(Utility::GmmUMDReadRegistryFullPath(GMM_LOG_REG_KEY_SUB_PATH, GMM_LOG_LEVEL_REGKEY, ®keyVal))
90*35ffd701SAndroid Build Coastguard Worker {
91*35ffd701SAndroid Build Coastguard Worker switch(static_cast<GmmLogLevel>(regkeyVal))
92*35ffd701SAndroid Build Coastguard Worker {
93*35ffd701SAndroid Build Coastguard Worker case Trace:
94*35ffd701SAndroid Build Coastguard Worker LogLevel = spdlog::level::trace;
95*35ffd701SAndroid Build Coastguard Worker break;
96*35ffd701SAndroid Build Coastguard Worker case Info:
97*35ffd701SAndroid Build Coastguard Worker LogLevel = spdlog::level::info;
98*35ffd701SAndroid Build Coastguard Worker break;
99*35ffd701SAndroid Build Coastguard Worker case Error:
100*35ffd701SAndroid Build Coastguard Worker LogLevel = spdlog::level::err;
101*35ffd701SAndroid Build Coastguard Worker break;
102*35ffd701SAndroid Build Coastguard Worker case Critical:
103*35ffd701SAndroid Build Coastguard Worker LogLevel = spdlog::level::critical;
104*35ffd701SAndroid Build Coastguard Worker break;
105*35ffd701SAndroid Build Coastguard Worker case Off:
106*35ffd701SAndroid Build Coastguard Worker default:
107*35ffd701SAndroid Build Coastguard Worker LogLevel = spdlog::level::off;
108*35ffd701SAndroid Build Coastguard Worker break;
109*35ffd701SAndroid Build Coastguard Worker }
110*35ffd701SAndroid Build Coastguard Worker }
111*35ffd701SAndroid Build Coastguard Worker
112*35ffd701SAndroid Build Coastguard Worker #endif
113*35ffd701SAndroid Build Coastguard Worker if(LogLevel == spdlog::level::off)
114*35ffd701SAndroid Build Coastguard Worker {
115*35ffd701SAndroid Build Coastguard Worker return false;
116*35ffd701SAndroid Build Coastguard Worker }
117*35ffd701SAndroid Build Coastguard Worker
118*35ffd701SAndroid Build Coastguard Worker try
119*35ffd701SAndroid Build Coastguard Worker {
120*35ffd701SAndroid Build Coastguard Worker if(LogMethod == ToFile)
121*35ffd701SAndroid Build Coastguard Worker {
122*35ffd701SAndroid Build Coastguard Worker // Get process name
123*35ffd701SAndroid Build Coastguard Worker #if _WIN32
124*35ffd701SAndroid Build Coastguard Worker TCHAR ProcPathTChar[MAX_PATH];
125*35ffd701SAndroid Build Coastguard Worker GetModuleFileName(NULL, ProcPathTChar, MAX_PATH);
126*35ffd701SAndroid Build Coastguard Worker ProcPath = std::string(ProcPathTChar);
127*35ffd701SAndroid Build Coastguard Worker
128*35ffd701SAndroid Build Coastguard Worker size_t PosOfLastSlash = ProcPath.find_last_of("\\") + 1;
129*35ffd701SAndroid Build Coastguard Worker size_t PosOfLastDot = ProcPath.find_last_of(".");
130*35ffd701SAndroid Build Coastguard Worker
131*35ffd701SAndroid Build Coastguard Worker if(PosOfLastDot <= PosOfLastSlash || PosOfLastDot >= ProcPath.length() || PosOfLastSlash >= ProcPath.length())
132*35ffd701SAndroid Build Coastguard Worker {
133*35ffd701SAndroid Build Coastguard Worker ProcName = GMM_UNKNOWN_PROCESS;
134*35ffd701SAndroid Build Coastguard Worker }
135*35ffd701SAndroid Build Coastguard Worker else
136*35ffd701SAndroid Build Coastguard Worker {
137*35ffd701SAndroid Build Coastguard Worker ProcName = ProcPath.substr(PosOfLastSlash, PosOfLastDot - PosOfLastSlash);
138*35ffd701SAndroid Build Coastguard Worker }
139*35ffd701SAndroid Build Coastguard Worker #else
140*35ffd701SAndroid Build Coastguard Worker ProcPath = "Unknown_Proc_Path";
141*35ffd701SAndroid Build Coastguard Worker ProcName = GMM_UNKNOWN_PROCESS;
142*35ffd701SAndroid Build Coastguard Worker
143*35ffd701SAndroid Build Coastguard Worker std::ifstream file;
144*35ffd701SAndroid Build Coastguard Worker file.open("/proc/self/cmdline");
145*35ffd701SAndroid Build Coastguard Worker if(file.is_open())
146*35ffd701SAndroid Build Coastguard Worker {
147*35ffd701SAndroid Build Coastguard Worker // Get process name
148*35ffd701SAndroid Build Coastguard Worker getline(file, ProcPath);
149*35ffd701SAndroid Build Coastguard Worker
150*35ffd701SAndroid Build Coastguard Worker size_t PosOfLastSlash = ProcPath.find_last_of("/") + 1;
151*35ffd701SAndroid Build Coastguard Worker if(PosOfLastSlash >= ProcPath.length())
152*35ffd701SAndroid Build Coastguard Worker {
153*35ffd701SAndroid Build Coastguard Worker ProcName = GMM_UNKNOWN_PROCESS;
154*35ffd701SAndroid Build Coastguard Worker }
155*35ffd701SAndroid Build Coastguard Worker else
156*35ffd701SAndroid Build Coastguard Worker {
157*35ffd701SAndroid Build Coastguard Worker // "length-1" to remove null character
158*35ffd701SAndroid Build Coastguard Worker ProcName = ProcPath.substr(PosOfLastSlash, ProcPath.length() - 1);
159*35ffd701SAndroid Build Coastguard Worker }
160*35ffd701SAndroid Build Coastguard Worker
161*35ffd701SAndroid Build Coastguard Worker file.close();
162*35ffd701SAndroid Build Coastguard Worker }
163*35ffd701SAndroid Build Coastguard Worker
164*35ffd701SAndroid Build Coastguard Worker #endif
165*35ffd701SAndroid Build Coastguard Worker
166*35ffd701SAndroid Build Coastguard Worker // Get process ID
167*35ffd701SAndroid Build Coastguard Worker #if _WIN32
168*35ffd701SAndroid Build Coastguard Worker Pid = _getpid();
169*35ffd701SAndroid Build Coastguard Worker #else
170*35ffd701SAndroid Build Coastguard Worker Pid = getpid();
171*35ffd701SAndroid Build Coastguard Worker #endif
172*35ffd701SAndroid Build Coastguard Worker std::string PidStr = std::to_string(Pid);
173*35ffd701SAndroid Build Coastguard Worker
174*35ffd701SAndroid Build Coastguard Worker // TODO: Multiple GmmLib instance can be running in the same process. In that case, the file name will be
175*35ffd701SAndroid Build Coastguard Worker // the same for two instances. Figure out a way to differentiate between the two instances.
176*35ffd701SAndroid Build Coastguard Worker #if _WIN32
177*35ffd701SAndroid Build Coastguard Worker LogFilePath = std::string("c:\\") + std::string(GMM_LOG_FILENAME) + "_" + ProcName + "_" + PidStr;
178*35ffd701SAndroid Build Coastguard Worker #else
179*35ffd701SAndroid Build Coastguard Worker LogFilePath = std::string(".//") + std::string(GMM_LOG_FILENAME) + "" + ProcName + "_" + PidStr;
180*35ffd701SAndroid Build Coastguard Worker #endif
181*35ffd701SAndroid Build Coastguard Worker // Create logger
182*35ffd701SAndroid Build Coastguard Worker SpdLogger = spdlog::rotating_logger_mt(GMM_LOGGER_NAME,
183*35ffd701SAndroid Build Coastguard Worker LogFilePath,
184*35ffd701SAndroid Build Coastguard Worker GMM_LOG_FILE_SIZE,
185*35ffd701SAndroid Build Coastguard Worker GMM_ROTATE_FILE_NUMBER);
186*35ffd701SAndroid Build Coastguard Worker
187*35ffd701SAndroid Build Coastguard Worker // Log process path
188*35ffd701SAndroid Build Coastguard Worker SpdLogger->set_pattern("Process path: %v");
189*35ffd701SAndroid Build Coastguard Worker SpdLogger->info(ProcPath.c_str());
190*35ffd701SAndroid Build Coastguard Worker }
191*35ffd701SAndroid Build Coastguard Worker else
192*35ffd701SAndroid Build Coastguard Worker {
193*35ffd701SAndroid Build Coastguard Worker #if defined(_WIN32)
194*35ffd701SAndroid Build Coastguard Worker // Log to debugger
195*35ffd701SAndroid Build Coastguard Worker auto debugger_sink = std::make_shared<spdlog::sinks::Debugger>();
196*35ffd701SAndroid Build Coastguard Worker SpdLogger = std::make_shared<spdlog::logger>(GMM_LOGGER_NAME, debugger_sink);
197*35ffd701SAndroid Build Coastguard Worker #elif defined(__ANDROID__)
198*35ffd701SAndroid Build Coastguard Worker // Log to logcat
199*35ffd701SAndroid Build Coastguard Worker SpdLogger = spdlog::android_logger(GMM_LOGGER_NAME, GMM_LOG_TAG);
200*35ffd701SAndroid Build Coastguard Worker #elif defined(__linux__)
201*35ffd701SAndroid Build Coastguard Worker // Log to syslog
202*35ffd701SAndroid Build Coastguard Worker SpdLogger = spdlog::syslog_logger(GMM_LOGGER_NAME, GMM_LOG_TAG, 1 /*Log Pid*/);
203*35ffd701SAndroid Build Coastguard Worker #else
204*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
205*35ffd701SAndroid Build Coastguard Worker return false;
206*35ffd701SAndroid Build Coastguard Worker #endif
207*35ffd701SAndroid Build Coastguard Worker }
208*35ffd701SAndroid Build Coastguard Worker }
209*35ffd701SAndroid Build Coastguard Worker catch(const spdlog::spdlog_ex &ex)
210*35ffd701SAndroid Build Coastguard Worker {
211*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
212*35ffd701SAndroid Build Coastguard Worker return false;
213*35ffd701SAndroid Build Coastguard Worker }
214*35ffd701SAndroid Build Coastguard Worker
215*35ffd701SAndroid Build Coastguard Worker // Set log level
216*35ffd701SAndroid Build Coastguard Worker SpdLogger->set_level(LogLevel);
217*35ffd701SAndroid Build Coastguard Worker // Set log pattern
218*35ffd701SAndroid Build Coastguard Worker SpdLogger->set_pattern("[%T.%e] [Thread %t] [%l] %v"); // [Time] [Thread id] [Log Level] [Text to Log]
219*35ffd701SAndroid Build Coastguard Worker
220*35ffd701SAndroid Build Coastguard Worker return true;
221*35ffd701SAndroid Build Coastguard Worker }
222*35ffd701SAndroid Build Coastguard Worker
223*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
224*35ffd701SAndroid Build Coastguard Worker /// Gmm Logger constructor
225*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Logger()226*35ffd701SAndroid Build Coastguard Worker GmmLib::Logger::Logger()
227*35ffd701SAndroid Build Coastguard Worker : LogMethod(ToOSLog),
228*35ffd701SAndroid Build Coastguard Worker LogLevel(spdlog::level::off)
229*35ffd701SAndroid Build Coastguard Worker {
230*35ffd701SAndroid Build Coastguard Worker if(!GmmLogInit())
231*35ffd701SAndroid Build Coastguard Worker {
232*35ffd701SAndroid Build Coastguard Worker spdlog::set_level(spdlog::level::off);
233*35ffd701SAndroid Build Coastguard Worker }
234*35ffd701SAndroid Build Coastguard Worker }
235*35ffd701SAndroid Build Coastguard Worker
236*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
237*35ffd701SAndroid Build Coastguard Worker /// Gmm Logger Destructor
238*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
~Logger()239*35ffd701SAndroid Build Coastguard Worker GmmLib::Logger::~Logger()
240*35ffd701SAndroid Build Coastguard Worker {
241*35ffd701SAndroid Build Coastguard Worker if(SpdLogger)
242*35ffd701SAndroid Build Coastguard Worker {
243*35ffd701SAndroid Build Coastguard Worker SpdLogger->flush();
244*35ffd701SAndroid Build Coastguard Worker }
245*35ffd701SAndroid Build Coastguard Worker }
246*35ffd701SAndroid Build Coastguard Worker
247*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
248*35ffd701SAndroid Build Coastguard Worker /// Gmm Logger C wrappers
249*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
250*35ffd701SAndroid Build Coastguard Worker #if !_WIN32
251*35ffd701SAndroid Build Coastguard Worker // Linux/Android replacement for MS version of _vscprintf
vscprintf_lin(const char * msg,va_list args)252*35ffd701SAndroid Build Coastguard Worker inline int vscprintf_lin(const char *msg, va_list args)
253*35ffd701SAndroid Build Coastguard Worker {
254*35ffd701SAndroid Build Coastguard Worker char c;
255*35ffd701SAndroid Build Coastguard Worker va_list args_cpy;
256*35ffd701SAndroid Build Coastguard Worker
257*35ffd701SAndroid Build Coastguard Worker // Copy `args' to prevent internal pointer modification from vsnprintf
258*35ffd701SAndroid Build Coastguard Worker va_copy(args_cpy, args);
259*35ffd701SAndroid Build Coastguard Worker int len = vsnprintf(&c, 1, msg, args_cpy);
260*35ffd701SAndroid Build Coastguard Worker va_end(args_cpy);
261*35ffd701SAndroid Build Coastguard Worker return len;
262*35ffd701SAndroid Build Coastguard Worker }
263*35ffd701SAndroid Build Coastguard Worker #endif
264*35ffd701SAndroid Build Coastguard Worker
265*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
266*35ffd701SAndroid Build Coastguard Worker /// Gmm Logger C wrapper for GMM_LOG_* Macros
267*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmLibLogging(GmmLogLevel Level,const char * str,...)268*35ffd701SAndroid Build Coastguard Worker extern "C" void GMM_STDCALL GmmLibLogging(GmmLogLevel Level, const char *str, ...)
269*35ffd701SAndroid Build Coastguard Worker {
270*35ffd701SAndroid Build Coastguard Worker va_list args;
271*35ffd701SAndroid Build Coastguard Worker
272*35ffd701SAndroid Build Coastguard Worker if(GmmLoggerPerProc.SpdLogger)
273*35ffd701SAndroid Build Coastguard Worker {
274*35ffd701SAndroid Build Coastguard Worker va_start(args, str);
275*35ffd701SAndroid Build Coastguard Worker
276*35ffd701SAndroid Build Coastguard Worker #if _WIN32
277*35ffd701SAndroid Build Coastguard Worker const size_t length = _vscprintf(str, args);
278*35ffd701SAndroid Build Coastguard Worker #else
279*35ffd701SAndroid Build Coastguard Worker const size_t length = vscprintf_lin(str, args);
280*35ffd701SAndroid Build Coastguard Worker #endif
281*35ffd701SAndroid Build Coastguard Worker
282*35ffd701SAndroid Build Coastguard Worker char *temp = new char[length + 1];
283*35ffd701SAndroid Build Coastguard Worker
284*35ffd701SAndroid Build Coastguard Worker if(temp)
285*35ffd701SAndroid Build Coastguard Worker {
286*35ffd701SAndroid Build Coastguard Worker
287*35ffd701SAndroid Build Coastguard Worker #if _WIN32
288*35ffd701SAndroid Build Coastguard Worker vsprintf_s(temp, length + 1, str, args);
289*35ffd701SAndroid Build Coastguard Worker #else
290*35ffd701SAndroid Build Coastguard Worker vsnprintf(temp, length + 1, str, args);
291*35ffd701SAndroid Build Coastguard Worker #endif
292*35ffd701SAndroid Build Coastguard Worker
293*35ffd701SAndroid Build Coastguard Worker switch(Level)
294*35ffd701SAndroid Build Coastguard Worker {
295*35ffd701SAndroid Build Coastguard Worker case Trace:
296*35ffd701SAndroid Build Coastguard Worker // Set log level to trace if we want trace msges to be printed
297*35ffd701SAndroid Build Coastguard Worker //GmmLoggerPerProc.SpdLogger->set_level(spdlog::level::trace);
298*35ffd701SAndroid Build Coastguard Worker GmmLoggerPerProc.SpdLogger->trace(temp);
299*35ffd701SAndroid Build Coastguard Worker break;
300*35ffd701SAndroid Build Coastguard Worker case Info:
301*35ffd701SAndroid Build Coastguard Worker // Set log level to info if we want info msges to be printed
302*35ffd701SAndroid Build Coastguard Worker //GmmLoggerPerProc.SpdLogger->set_level(spdlog::level::info);
303*35ffd701SAndroid Build Coastguard Worker GmmLoggerPerProc.SpdLogger->info(temp);
304*35ffd701SAndroid Build Coastguard Worker break;
305*35ffd701SAndroid Build Coastguard Worker case Error:
306*35ffd701SAndroid Build Coastguard Worker GmmLoggerPerProc.SpdLogger->critical(temp);
307*35ffd701SAndroid Build Coastguard Worker break;
308*35ffd701SAndroid Build Coastguard Worker default:
309*35ffd701SAndroid Build Coastguard Worker break;
310*35ffd701SAndroid Build Coastguard Worker }
311*35ffd701SAndroid Build Coastguard Worker
312*35ffd701SAndroid Build Coastguard Worker delete[] temp;
313*35ffd701SAndroid Build Coastguard Worker }
314*35ffd701SAndroid Build Coastguard Worker }
315*35ffd701SAndroid Build Coastguard Worker
316*35ffd701SAndroid Build Coastguard Worker va_end(args);
317*35ffd701SAndroid Build Coastguard Worker }
318*35ffd701SAndroid Build Coastguard Worker
319*35ffd701SAndroid Build Coastguard Worker #endif //#if GMM_LOG_AVAILABLE
320