xref: /aosp_15_r20/external/armnn/src/armnn/Logging.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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