diff options
Diffstat (limited to 'common/log.cpp')
-rw-r--r-- | common/log.cpp | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/common/log.cpp b/common/log.cpp index d2e5f47..4606e67 100644 --- a/common/log.cpp +++ b/common/log.cpp | |||
@@ -3,11 +3,19 @@ | |||
3 | #include <QString> | 3 | #include <QString> |
4 | #include <QIODevice> | 4 | #include <QIODevice> |
5 | #include <QCoreApplication> | 5 | #include <QCoreApplication> |
6 | #include <QSettings> | ||
7 | #include <QStandardPaths> | ||
8 | #include <QSharedPointer> | ||
6 | #include <iostream> | 9 | #include <iostream> |
7 | #include <unistd.h> | 10 | #include <unistd.h> |
8 | 11 | ||
9 | using namespace Sink::Log; | 12 | using namespace Sink::Log; |
10 | 13 | ||
14 | static QSharedPointer<QSettings> config() | ||
15 | { | ||
16 | return QSharedPointer<QSettings>::create(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/sink/log.ini", QSettings::IniFormat); | ||
17 | } | ||
18 | |||
11 | class DebugStream: public QIODevice | 19 | class DebugStream: public QIODevice |
12 | { | 20 | { |
13 | public: | 21 | public: |
@@ -134,29 +142,44 @@ DebugLevel Sink::Log::debugLevelFromName(const QByteArray &name) | |||
134 | 142 | ||
135 | void Sink::Log::setDebugOutputLevel(DebugLevel debugLevel) | 143 | void Sink::Log::setDebugOutputLevel(DebugLevel debugLevel) |
136 | { | 144 | { |
137 | qputenv("SINKDEBUGLEVEL", debugLevelName(debugLevel)); | 145 | config()->setValue("level", debugLevel); |
138 | } | 146 | } |
139 | 147 | ||
140 | Sink::Log::DebugLevel Sink::Log::debugOutputLevel() | 148 | Sink::Log::DebugLevel Sink::Log::debugOutputLevel() |
141 | { | 149 | { |
142 | return debugLevelFromName(qgetenv("SINKDEBUGLEVEL")); | 150 | return static_cast<Sink::Log::DebugLevel>(config()->value("level", Sink::Log::Log).toInt()); |
143 | } | 151 | } |
144 | 152 | ||
145 | void Sink::Log::setDebugOutputFilter(FilterType type, const QByteArrayList &filter) | 153 | void Sink::Log::setDebugOutputFilter(FilterType type, const QByteArrayList &filter) |
146 | { | 154 | { |
147 | switch (type) { | 155 | switch (type) { |
148 | case ApplicationName: | 156 | case ApplicationName: |
149 | qputenv("SINKDEBUGFILTER", filter.join(',')); | 157 | config()->setValue("applicationfilter", QVariant::fromValue(filter)); |
150 | break; | 158 | break; |
151 | case Area: | 159 | case Area: |
152 | qputenv("SINKDEBUGAREAS", filter.join(',')); | 160 | config()->setValue("areafilter", QVariant::fromValue(filter)); |
153 | break; | 161 | break; |
154 | } | 162 | } |
155 | } | 163 | } |
156 | 164 | ||
165 | QByteArrayList Sink::Log::debugOutputFilter(FilterType type) | ||
166 | { | ||
167 | switch (type) { | ||
168 | case ApplicationName: | ||
169 | return config()->value("applicationfilter").value<QByteArrayList>(); | ||
170 | case Area: | ||
171 | return config()->value("areafilter").value<QByteArrayList>(); | ||
172 | } | ||
173 | } | ||
174 | |||
157 | void Sink::Log::setDebugOutputFields(const QByteArrayList &output) | 175 | void Sink::Log::setDebugOutputFields(const QByteArrayList &output) |
158 | { | 176 | { |
159 | qputenv("SINKDEBUGOUTPUT", output.join(',')); | 177 | config()->setValue("outputfields", QVariant::fromValue(output)); |
178 | } | ||
179 | |||
180 | QByteArrayList Sink::Log::debugOutputFields() | ||
181 | { | ||
182 | return config()->value("outputfields").value<QByteArrayList>(); | ||
160 | } | 183 | } |
161 | 184 | ||
162 | static QByteArray getProgramName() | 185 | static QByteArray getProgramName() |
@@ -191,12 +214,11 @@ static bool caseInsensitiveContains(const QByteArray &pattern, const QByteArrayL | |||
191 | QDebug Sink::Log::debugStream(DebugLevel debugLevel, int line, const char* file, const char* function, const char* debugArea) | 214 | QDebug Sink::Log::debugStream(DebugLevel debugLevel, int line, const char* file, const char* function, const char* debugArea) |
192 | { | 215 | { |
193 | static NullStream nullstream; | 216 | static NullStream nullstream; |
194 | DebugLevel debugOutputLevel = debugLevelFromName(qgetenv("SINKDEBUGLEVEL")); | 217 | if (debugLevel < debugOutputLevel()) { |
195 | if (debugLevel < debugOutputLevel) { | ||
196 | return QDebug(&nullstream); | 218 | return QDebug(&nullstream); |
197 | } | 219 | } |
198 | 220 | ||
199 | auto areas = qgetenv("SINKDEBUGAREAS").split(','); | 221 | auto areas = debugOutputFilter(Sink::Log::Area); |
200 | if (debugArea && !areas.isEmpty()) { | 222 | if (debugArea && !areas.isEmpty()) { |
201 | if (!containsItemStartingWith(debugArea, areas)) { | 223 | if (!containsItemStartingWith(debugArea, areas)) { |
202 | return QDebug(&nullstream); | 224 | return QDebug(&nullstream); |
@@ -204,7 +226,7 @@ QDebug Sink::Log::debugStream(DebugLevel debugLevel, int line, const char* file, | |||
204 | } | 226 | } |
205 | static QByteArray programName = getProgramName(); | 227 | static QByteArray programName = getProgramName(); |
206 | 228 | ||
207 | auto filter = qgetenv("SINKDEBUGFILTER").split(','); | 229 | auto filter = debugOutputFilter(Sink::Log::ApplicationName); |
208 | if (!filter.isEmpty() && !filter.contains(programName)) { | 230 | if (!filter.isEmpty() && !filter.contains(programName)) { |
209 | if (!containsItemStartingWith(programName, filter)) { | 231 | if (!containsItemStartingWith(programName, filter)) { |
210 | return QDebug(&nullstream); | 232 | return QDebug(&nullstream); |
@@ -231,7 +253,7 @@ QDebug Sink::Log::debugStream(DebugLevel debugLevel, int line, const char* file, | |||
231 | break; | 253 | break; |
232 | }; | 254 | }; |
233 | 255 | ||
234 | auto debugOutput = qgetenv("SINKDEBUGOUTPUT").split(','); | 256 | auto debugOutput = debugOutputFields(); |
235 | 257 | ||
236 | bool showLocation = debugOutput.isEmpty() ? false : caseInsensitiveContains("location", debugOutput); | 258 | bool showLocation = debugOutput.isEmpty() ? false : caseInsensitiveContains("location", debugOutput); |
237 | bool showFunction = debugOutput.isEmpty() ? false : caseInsensitiveContains("function", debugOutput); | 259 | bool showFunction = debugOutput.isEmpty() ? false : caseInsensitiveContains("function", debugOutput); |