1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker
6*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Logging.hpp>
7*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/IgnoreUnused.hpp>
8*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Utils.hpp>
9*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/Assert.hpp>
10*89c4ff92SAndroid Build Coastguard Worker
11*89c4ff92SAndroid Build Coastguard Worker #if defined(_MSC_VER)
12*89c4ff92SAndroid Build Coastguard Worker #include <common/include/WindowsWrapper.hpp>
13*89c4ff92SAndroid Build Coastguard Worker #endif
14*89c4ff92SAndroid Build Coastguard Worker
15*89c4ff92SAndroid Build Coastguard Worker #if defined(__ANDROID__)
16*89c4ff92SAndroid Build Coastguard Worker #include <android/log.h>
17*89c4ff92SAndroid Build Coastguard Worker #endif
18*89c4ff92SAndroid Build Coastguard Worker
19*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
20*89c4ff92SAndroid Build Coastguard Worker
21*89c4ff92SAndroid Build Coastguard Worker namespace armnn
22*89c4ff92SAndroid Build Coastguard Worker {
23*89c4ff92SAndroid Build Coastguard Worker
24*89c4ff92SAndroid Build Coastguard Worker template<LogSeverity Level>
Get()25*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<Level>& SimpleLogger<Level>::Get()
26*89c4ff92SAndroid Build Coastguard Worker {
27*89c4ff92SAndroid Build Coastguard Worker static SimpleLogger<Level> logger;
28*89c4ff92SAndroid Build Coastguard Worker return logger;
29*89c4ff92SAndroid Build Coastguard Worker }
30*89c4ff92SAndroid Build Coastguard Worker
31*89c4ff92SAndroid Build Coastguard Worker template<>
Get()32*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Debug>& SimpleLogger<LogSeverity::Debug>::Get()
33*89c4ff92SAndroid Build Coastguard Worker {
34*89c4ff92SAndroid Build Coastguard Worker static SimpleLogger<LogSeverity::Debug> logger;
35*89c4ff92SAndroid Build Coastguard Worker return logger;
36*89c4ff92SAndroid Build Coastguard Worker }
37*89c4ff92SAndroid Build Coastguard Worker
38*89c4ff92SAndroid Build Coastguard Worker template<>
Get()39*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Trace>& SimpleLogger<LogSeverity::Trace>::Get()
40*89c4ff92SAndroid Build Coastguard Worker {
41*89c4ff92SAndroid Build Coastguard Worker static SimpleLogger<LogSeverity::Trace> logger;
42*89c4ff92SAndroid Build Coastguard Worker return logger;
43*89c4ff92SAndroid Build Coastguard Worker }
44*89c4ff92SAndroid Build Coastguard Worker
45*89c4ff92SAndroid Build Coastguard Worker template<>
Get()46*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Info>& SimpleLogger<LogSeverity::Info>::Get()
47*89c4ff92SAndroid Build Coastguard Worker {
48*89c4ff92SAndroid Build Coastguard Worker static SimpleLogger<LogSeverity::Info> logger;
49*89c4ff92SAndroid Build Coastguard Worker return logger;
50*89c4ff92SAndroid Build Coastguard Worker }
51*89c4ff92SAndroid Build Coastguard Worker
52*89c4ff92SAndroid Build Coastguard Worker template<>
Get()53*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Warning>& SimpleLogger<LogSeverity::Warning>::Get()
54*89c4ff92SAndroid Build Coastguard Worker {
55*89c4ff92SAndroid Build Coastguard Worker static SimpleLogger<LogSeverity::Warning> logger;
56*89c4ff92SAndroid Build Coastguard Worker return logger;
57*89c4ff92SAndroid Build Coastguard Worker }
58*89c4ff92SAndroid Build Coastguard Worker
59*89c4ff92SAndroid Build Coastguard Worker template<>
Get()60*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Error>& SimpleLogger<LogSeverity::Error>::Get()
61*89c4ff92SAndroid Build Coastguard Worker {
62*89c4ff92SAndroid Build Coastguard Worker static SimpleLogger<LogSeverity::Error> logger;
63*89c4ff92SAndroid Build Coastguard Worker return logger;
64*89c4ff92SAndroid Build Coastguard Worker }
65*89c4ff92SAndroid Build Coastguard Worker
66*89c4ff92SAndroid Build Coastguard Worker template<>
Get()67*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Fatal>& SimpleLogger<LogSeverity::Fatal>::Get()
68*89c4ff92SAndroid Build Coastguard Worker {
69*89c4ff92SAndroid Build Coastguard Worker static SimpleLogger<LogSeverity::Fatal> logger;
70*89c4ff92SAndroid Build Coastguard Worker return logger;
71*89c4ff92SAndroid Build Coastguard Worker }
72*89c4ff92SAndroid Build Coastguard Worker
SetLogFilter(LogSeverity level)73*89c4ff92SAndroid Build Coastguard Worker void SetLogFilter(LogSeverity level)
74*89c4ff92SAndroid Build Coastguard Worker {
75*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Trace>::Get().Enable(false);
76*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Debug>::Get().Enable(false);
77*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Info>::Get().Enable(false);
78*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Warning>::Get().Enable(false);
79*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Error>::Get().Enable(false);
80*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Fatal>::Get().Enable(false);
81*89c4ff92SAndroid Build Coastguard Worker switch (level)
82*89c4ff92SAndroid Build Coastguard Worker {
83*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Trace:
84*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Trace>::Get().Enable(true);
85*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
86*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Debug:
87*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Debug>::Get().Enable(true);
88*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
89*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Info:
90*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Info>::Get().Enable(true);
91*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
92*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Warning:
93*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Warning>::Get().Enable(true);
94*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
95*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Error:
96*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Error>::Get().Enable(true);
97*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
98*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Fatal:
99*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<LogSeverity::Fatal>::Get().Enable(true);
100*89c4ff92SAndroid Build Coastguard Worker break;
101*89c4ff92SAndroid Build Coastguard Worker default:
102*89c4ff92SAndroid Build Coastguard Worker ARMNN_ASSERT(false);
103*89c4ff92SAndroid Build Coastguard Worker }
104*89c4ff92SAndroid Build Coastguard Worker }
105*89c4ff92SAndroid Build Coastguard Worker
106*89c4ff92SAndroid Build Coastguard Worker class StandardOutputColourSink : public LogSink
107*89c4ff92SAndroid Build Coastguard Worker {
108*89c4ff92SAndroid Build Coastguard Worker public:
StandardOutputColourSink(LogSeverity level=LogSeverity::Info)109*89c4ff92SAndroid Build Coastguard Worker StandardOutputColourSink(LogSeverity level = LogSeverity::Info)
110*89c4ff92SAndroid Build Coastguard Worker : m_Level(level)
111*89c4ff92SAndroid Build Coastguard Worker {
112*89c4ff92SAndroid Build Coastguard Worker }
113*89c4ff92SAndroid Build Coastguard Worker
Consume(const std::string & s)114*89c4ff92SAndroid Build Coastguard Worker void Consume(const std::string& s) override
115*89c4ff92SAndroid Build Coastguard Worker {
116*89c4ff92SAndroid Build Coastguard Worker std::cout << GetColour(m_Level) << s << ResetColour() << std::endl;
117*89c4ff92SAndroid Build Coastguard Worker }
118*89c4ff92SAndroid Build Coastguard Worker
119*89c4ff92SAndroid Build Coastguard Worker private:
ResetColour()120*89c4ff92SAndroid Build Coastguard Worker std::string ResetColour()
121*89c4ff92SAndroid Build Coastguard Worker {
122*89c4ff92SAndroid Build Coastguard Worker return "\033[0m";
123*89c4ff92SAndroid Build Coastguard Worker }
124*89c4ff92SAndroid Build Coastguard Worker
GetColour(LogSeverity level)125*89c4ff92SAndroid Build Coastguard Worker std::string GetColour(LogSeverity level)
126*89c4ff92SAndroid Build Coastguard Worker {
127*89c4ff92SAndroid Build Coastguard Worker switch(level)
128*89c4ff92SAndroid Build Coastguard Worker {
129*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Trace:
130*89c4ff92SAndroid Build Coastguard Worker return "\033[35m";
131*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Debug:
132*89c4ff92SAndroid Build Coastguard Worker return "\033[32m";
133*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Info:
134*89c4ff92SAndroid Build Coastguard Worker return "\033[0m";
135*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Warning:
136*89c4ff92SAndroid Build Coastguard Worker return "\033[33m";
137*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Error:
138*89c4ff92SAndroid Build Coastguard Worker return "\033[31m";
139*89c4ff92SAndroid Build Coastguard Worker case LogSeverity::Fatal:
140*89c4ff92SAndroid Build Coastguard Worker return "\033[41;30m";
141*89c4ff92SAndroid Build Coastguard Worker
142*89c4ff92SAndroid Build Coastguard Worker default:
143*89c4ff92SAndroid Build Coastguard Worker return "\033[0m";
144*89c4ff92SAndroid Build Coastguard Worker }
145*89c4ff92SAndroid Build Coastguard Worker }
146*89c4ff92SAndroid Build Coastguard Worker LogSeverity m_Level;
147*89c4ff92SAndroid Build Coastguard Worker };
148*89c4ff92SAndroid Build Coastguard Worker
149*89c4ff92SAndroid Build Coastguard Worker class DebugOutputSink : public LogSink
150*89c4ff92SAndroid Build Coastguard Worker {
151*89c4ff92SAndroid Build Coastguard Worker public:
Consume(const std::string & s)152*89c4ff92SAndroid Build Coastguard Worker void Consume(const std::string& s) override
153*89c4ff92SAndroid Build Coastguard Worker {
154*89c4ff92SAndroid Build Coastguard Worker IgnoreUnused(s);
155*89c4ff92SAndroid Build Coastguard Worker #if defined(_MSC_VER)
156*89c4ff92SAndroid Build Coastguard Worker OutputDebugString(s.c_str());
157*89c4ff92SAndroid Build Coastguard Worker OutputDebugString("\n");
158*89c4ff92SAndroid Build Coastguard Worker #elif defined(__ANDROID__)
159*89c4ff92SAndroid Build Coastguard Worker __android_log_write(ANDROID_LOG_DEBUG, "armnn", s.c_str());
160*89c4ff92SAndroid Build Coastguard Worker #else
161*89c4ff92SAndroid Build Coastguard Worker IgnoreUnused(s);
162*89c4ff92SAndroid Build Coastguard Worker #endif
163*89c4ff92SAndroid Build Coastguard Worker }
164*89c4ff92SAndroid Build Coastguard Worker };
165*89c4ff92SAndroid Build Coastguard Worker
166*89c4ff92SAndroid Build Coastguard Worker template<LogSeverity Level>
SetLoggingSinks(bool standardOut,bool debugOut,bool coloured)167*89c4ff92SAndroid Build Coastguard Worker inline void SetLoggingSinks(bool standardOut, bool debugOut, bool coloured)
168*89c4ff92SAndroid Build Coastguard Worker {
169*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<Level>::Get().RemoveAllSinks();
170*89c4ff92SAndroid Build Coastguard Worker
171*89c4ff92SAndroid Build Coastguard Worker if (standardOut)
172*89c4ff92SAndroid Build Coastguard Worker {
173*89c4ff92SAndroid Build Coastguard Worker if (coloured)
174*89c4ff92SAndroid Build Coastguard Worker {
175*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<Level>::Get().AddSink(
176*89c4ff92SAndroid Build Coastguard Worker std::make_shared<StandardOutputColourSink>(Level));
177*89c4ff92SAndroid Build Coastguard Worker } else
178*89c4ff92SAndroid Build Coastguard Worker {
179*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<Level>::Get().AddSink(
180*89c4ff92SAndroid Build Coastguard Worker std::make_shared<StandardOutputSink>());
181*89c4ff92SAndroid Build Coastguard Worker }
182*89c4ff92SAndroid Build Coastguard Worker }
183*89c4ff92SAndroid Build Coastguard Worker
184*89c4ff92SAndroid Build Coastguard Worker if (debugOut)
185*89c4ff92SAndroid Build Coastguard Worker {
186*89c4ff92SAndroid Build Coastguard Worker SimpleLogger<Level>::Get().AddSink(
187*89c4ff92SAndroid Build Coastguard Worker std::make_shared<DebugOutputSink>());
188*89c4ff92SAndroid Build Coastguard Worker }
189*89c4ff92SAndroid Build Coastguard Worker }
190*89c4ff92SAndroid Build Coastguard Worker
SetAllLoggingSinks(bool standardOut,bool debugOut,bool coloured)191*89c4ff92SAndroid Build Coastguard Worker void SetAllLoggingSinks(bool standardOut, bool debugOut, bool coloured)
192*89c4ff92SAndroid Build Coastguard Worker {
193*89c4ff92SAndroid Build Coastguard Worker SetLoggingSinks<LogSeverity::Trace>(standardOut, debugOut, coloured);
194*89c4ff92SAndroid Build Coastguard Worker SetLoggingSinks<LogSeverity::Debug>(standardOut, debugOut, coloured);
195*89c4ff92SAndroid Build Coastguard Worker SetLoggingSinks<LogSeverity::Info>(standardOut, debugOut, coloured);
196*89c4ff92SAndroid Build Coastguard Worker SetLoggingSinks<LogSeverity::Warning>(standardOut, debugOut, coloured);
197*89c4ff92SAndroid Build Coastguard Worker SetLoggingSinks<LogSeverity::Error>(standardOut, debugOut, coloured);
198*89c4ff92SAndroid Build Coastguard Worker SetLoggingSinks<LogSeverity::Fatal>(standardOut, debugOut, coloured);
199*89c4ff92SAndroid Build Coastguard Worker }
200*89c4ff92SAndroid Build Coastguard Worker
201*89c4ff92SAndroid Build Coastguard Worker } //namespace armnn
202