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