blob: 27971c56e4375339f897e7fde7a62f7293630c44 [file] [log] [blame]
Derek Lamberti08446972019-11-26 16:38:31 +00001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Derek Lamberti08446972019-11-26 16:38:31 +00003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Matthew Benthamd3a07832020-01-15 17:21:38 +00008#include <armnn/Utils.hpp>
Derek Lamberti08446972019-11-26 16:38:31 +00009#include <iostream>
10
Derek Lamberti08446972019-11-26 16:38:31 +000011namespace armnn
12{
13
14inline std::string LevelToString(LogSeverity level)
15{
16 switch(level)
17 {
18 case LogSeverity::Trace:
19 return "Trace";
20 case LogSeverity::Debug:
21 return "Debug";
22 case LogSeverity::Info:
23 return "Info";
24 case LogSeverity::Warning:
25 return "Warning";
26 case LogSeverity::Error:
27 return "Error";
28 case LogSeverity::Fatal:
29 return "Fatal";
30 default:
31 return "Log";
32 }
33}
34
35class LogSink
36{
37public:
38 virtual ~LogSink(){};
39
Francis Murtaghb4f312c2019-12-31 12:44:20 +000040 virtual void Consume(const std::string&) = 0;
Derek Lamberti08446972019-11-26 16:38:31 +000041private:
42
43};
44
Derek Lamberti08446972019-11-26 16:38:31 +000045class StandardOutputSink : public LogSink
46{
47public:
48 void Consume(const std::string& s) override
49 {
50 std::cout << s << std::endl;
51 }
52};
53
Derek Lamberti08446972019-11-26 16:38:31 +000054struct ScopedRecord
55{
56 ScopedRecord(const std::vector<std::shared_ptr<LogSink>>& sinks, LogSeverity level, bool enabled)
57 : m_LogSinks(sinks)
58 , m_Enabled(enabled)
59 {
60 if (enabled)
61 {
62 m_Os << LevelToString(level) << ": ";
63 }
64 }
65
66 ~ScopedRecord()
67 {
68 if (m_Enabled)
69 {
70 for (auto sink : m_LogSinks)
71 {
72 if (sink)
73 {
74 sink->Consume(m_Os.str());
75 }
76 }
77 }
78 }
79
80 ScopedRecord(const ScopedRecord&) = delete;
81 ScopedRecord& operator=(const ScopedRecord&) = delete;
Matthew Bentham13757bd2020-02-10 17:23:39 +000082 ScopedRecord& operator=(ScopedRecord&&) = delete;
83
Derek Lamberti08446972019-11-26 16:38:31 +000084 ScopedRecord(ScopedRecord&& other) = default;
Derek Lamberti08446972019-11-26 16:38:31 +000085
86 template<typename Streamable>
87 ScopedRecord& operator<<(const Streamable& s)
88 {
89 if (m_Enabled)
90 {
91 m_Os << s;
92 }
93 return (*this);
94 }
95
96private:
97 const std::vector<std::shared_ptr<LogSink>>& m_LogSinks;
98 std::ostringstream m_Os;
99 bool m_Enabled;
100};
101
102template<LogSeverity Level>
103class SimpleLogger
104{
105public:
106 SimpleLogger()
107 : m_Sinks{std::make_shared<StandardOutputSink>()}
108 , m_Enable(true)
109 {
110 }
111
112 static SimpleLogger& Get()
113 {
114 static SimpleLogger<Level> logger;
115 return logger;
116 }
117
118 void Enable(bool enable = true)
119 {
120 m_Enable = enable;
121 }
122
123 ScopedRecord StartNewRecord()
124 {
125 ScopedRecord record(m_Sinks, Level, m_Enable);
126 return record;
127 }
128
129 void RemoveAllSinks()
130 {
131 m_Sinks.clear();
132 }
133
134 void AddSink(std::shared_ptr<LogSink> sink)
135 {
136 m_Sinks.push_back(sink);
137 }
138private:
139 std::vector<std::shared_ptr<LogSink>> m_Sinks;
140 bool m_Enable;
141};
142
Matthew Benthamd3a07832020-01-15 17:21:38 +0000143void SetLogFilter(LogSeverity level);
Derek Lamberti08446972019-11-26 16:38:31 +0000144
Matthew Benthamd3a07832020-01-15 17:21:38 +0000145void SetAllLoggingSinks(bool standardOut, bool debugOut, bool coloured);
Derek Lamberti08446972019-11-26 16:38:31 +0000146
147enum class BoostLogSeverityMapping
148{
149 trace,
150 debug,
151 info,
152 warning,
153 error,
154 fatal
155};
156
157constexpr LogSeverity ConvertLogSeverity(BoostLogSeverityMapping severity)
158{
159 return static_cast<LogSeverity>(severity);
160}
161
162
163#define ARMNN_LOG(severity) \
164 armnn::SimpleLogger<ConvertLogSeverity(armnn::BoostLogSeverityMapping::severity)>::Get().StartNewRecord()
165
166} //namespace armnn