99#include < util/threadnames.h>
1010#include < util/time.h>
1111
12- #include < algorithm>
1312#include < array>
14- #include < mutex >
13+ #include < map >
1514#include < optional>
1615
1716const char * const DEFAULT_DEBUGLOGFILE = " debug.log" ;
@@ -142,49 +141,58 @@ bool BCLog::Logger::DefaultShrinkDebugFile() const
142141 return m_categories == BCLog::NONE;
143142}
144143
145- struct CLogCategoryDesc {
146- BCLog::LogFlags flag;
147- std::string category;
148- };
149-
150- const CLogCategoryDesc LogCategories[] =
151- {
152- {BCLog::NONE, " 0" },
153- {BCLog::NONE, " " },
154- {BCLog::NET, " net" },
155- {BCLog::TOR, " tor" },
156- {BCLog::MEMPOOL, " mempool" },
157- {BCLog::HTTP, " http" },
158- {BCLog::BENCH, " bench" },
159- {BCLog::ZMQ, " zmq" },
160- {BCLog::WALLETDB, " walletdb" },
161- {BCLog::RPC, " rpc" },
162- {BCLog::ESTIMATEFEE, " estimatefee" },
163- {BCLog::ADDRMAN, " addrman" },
164- {BCLog::SELECTCOINS, " selectcoins" },
165- {BCLog::REINDEX, " reindex" },
166- {BCLog::CMPCTBLOCK, " cmpctblock" },
167- {BCLog::RAND, " rand" },
168- {BCLog::PRUNE, " prune" },
169- {BCLog::PROXY, " proxy" },
170- {BCLog::MEMPOOLREJ, " mempoolrej" },
171- {BCLog::LIBEVENT, " libevent" },
172- {BCLog::COINDB, " coindb" },
173- {BCLog::QT, " qt" },
174- {BCLog::LEVELDB, " leveldb" },
175- {BCLog::VALIDATION, " validation" },
176- {BCLog::I2P, " i2p" },
177- {BCLog::IPC, " ipc" },
144+ static const std::map<std::string, BCLog::LogFlags> LOG_CATEGORIES_BY_STR{
145+ {" 0" , BCLog::NONE},
146+ {" " , BCLog::NONE},
147+ {" net" , BCLog::NET},
148+ {" tor" , BCLog::TOR},
149+ {" mempool" , BCLog::MEMPOOL},
150+ {" http" , BCLog::HTTP},
151+ {" bench" , BCLog::BENCH},
152+ {" zmq" , BCLog::ZMQ},
153+ {" walletdb" , BCLog::WALLETDB},
154+ {" rpc" , BCLog::RPC},
155+ {" estimatefee" , BCLog::ESTIMATEFEE},
156+ {" addrman" , BCLog::ADDRMAN},
157+ {" selectcoins" , BCLog::SELECTCOINS},
158+ {" reindex" , BCLog::REINDEX},
159+ {" cmpctblock" , BCLog::CMPCTBLOCK},
160+ {" rand" , BCLog::RAND},
161+ {" prune" , BCLog::PRUNE},
162+ {" proxy" , BCLog::PROXY},
163+ {" mempoolrej" , BCLog::MEMPOOLREJ},
164+ {" libevent" , BCLog::LIBEVENT},
165+ {" coindb" , BCLog::COINDB},
166+ {" qt" , BCLog::QT},
167+ {" leveldb" , BCLog::LEVELDB},
168+ {" validation" , BCLog::VALIDATION},
169+ {" i2p" , BCLog::I2P},
170+ {" ipc" , BCLog::IPC},
178171#ifdef DEBUG_LOCKCONTENTION
179- {BCLog::LOCK, " lock " },
172+ {" lock " , BCLog::LOCK},
180173#endif
181- {BCLog::UTIL, " util" },
182- {BCLog::BLOCKSTORAGE, " blockstorage" },
183- {BCLog::TXRECONCILIATION, " txreconciliation" },
184- {BCLog::SCAN, " scan" },
185- {BCLog::TXPACKAGES, " txpackages" },
186- {BCLog::ALL, " 1" },
187- {BCLog::ALL, " all" },
174+ {" util" , BCLog::UTIL},
175+ {" blockstorage" , BCLog::BLOCKSTORAGE},
176+ {" txreconciliation" , BCLog::TXRECONCILIATION},
177+ {" scan" , BCLog::SCAN},
178+ {" txpackages" , BCLog::TXPACKAGES},
179+ {" 1" , BCLog::ALL},
180+ {" all" , BCLog::ALL},
181+ };
182+
183+ static const std::unordered_map<BCLog::LogFlags, std::string> LOG_CATEGORIES_BY_FLAG{
184+ // Swap keys and values from LOG_CATEGORIES_BY_STR.
185+ [](const std::map<std::string, BCLog::LogFlags>& in) {
186+ std::unordered_map<BCLog::LogFlags, std::string> out;
187+ for (const auto & [k, v] : in) {
188+ switch (v) {
189+ case BCLog::NONE: out.emplace (BCLog::NONE, " " ); break ;
190+ case BCLog::ALL: out.emplace (BCLog::ALL, " all" ); break ;
191+ default : out.emplace (v, k);
192+ }
193+ }
194+ return out;
195+ }(LOG_CATEGORIES_BY_STR)
188196};
189197
190198bool GetLogCategory (BCLog::LogFlags& flag, const std::string& str)
@@ -193,11 +201,10 @@ bool GetLogCategory(BCLog::LogFlags& flag, const std::string& str)
193201 flag = BCLog::ALL;
194202 return true ;
195203 }
196- for (const CLogCategoryDesc& category_desc : LogCategories) {
197- if (category_desc.category == str) {
198- flag = category_desc.flag ;
199- return true ;
200- }
204+ auto it = LOG_CATEGORIES_BY_STR.find (str);
205+ if (it != LOG_CATEGORIES_BY_STR.end ()) {
206+ flag = it->second ;
207+ return true ;
201208 }
202209 return false ;
203210}
@@ -221,76 +228,9 @@ std::string BCLog::Logger::LogLevelToStr(BCLog::Level level)
221228
222229std::string LogCategoryToStr (BCLog::LogFlags category)
223230{
224- // Each log category string representation should sync with LogCategories
225- switch (category) {
226- case BCLog::LogFlags::NONE:
227- return " " ;
228- case BCLog::LogFlags::NET:
229- return " net" ;
230- case BCLog::LogFlags::TOR:
231- return " tor" ;
232- case BCLog::LogFlags::MEMPOOL:
233- return " mempool" ;
234- case BCLog::LogFlags::HTTP:
235- return " http" ;
236- case BCLog::LogFlags::BENCH:
237- return " bench" ;
238- case BCLog::LogFlags::ZMQ:
239- return " zmq" ;
240- case BCLog::LogFlags::WALLETDB:
241- return " walletdb" ;
242- case BCLog::LogFlags::RPC:
243- return " rpc" ;
244- case BCLog::LogFlags::ESTIMATEFEE:
245- return " estimatefee" ;
246- case BCLog::LogFlags::ADDRMAN:
247- return " addrman" ;
248- case BCLog::LogFlags::SELECTCOINS:
249- return " selectcoins" ;
250- case BCLog::LogFlags::REINDEX:
251- return " reindex" ;
252- case BCLog::LogFlags::CMPCTBLOCK:
253- return " cmpctblock" ;
254- case BCLog::LogFlags::RAND:
255- return " rand" ;
256- case BCLog::LogFlags::PRUNE:
257- return " prune" ;
258- case BCLog::LogFlags::PROXY:
259- return " proxy" ;
260- case BCLog::LogFlags::MEMPOOLREJ:
261- return " mempoolrej" ;
262- case BCLog::LogFlags::LIBEVENT:
263- return " libevent" ;
264- case BCLog::LogFlags::COINDB:
265- return " coindb" ;
266- case BCLog::LogFlags::QT:
267- return " qt" ;
268- case BCLog::LogFlags::LEVELDB:
269- return " leveldb" ;
270- case BCLog::LogFlags::VALIDATION:
271- return " validation" ;
272- case BCLog::LogFlags::I2P:
273- return " i2p" ;
274- case BCLog::LogFlags::IPC:
275- return " ipc" ;
276- #ifdef DEBUG_LOCKCONTENTION
277- case BCLog::LogFlags::LOCK:
278- return " lock" ;
279- #endif
280- case BCLog::LogFlags::UTIL:
281- return " util" ;
282- case BCLog::LogFlags::BLOCKSTORAGE:
283- return " blockstorage" ;
284- case BCLog::LogFlags::TXRECONCILIATION:
285- return " txreconciliation" ;
286- case BCLog::LogFlags::SCAN:
287- return " scan" ;
288- case BCLog::LogFlags::TXPACKAGES:
289- return " txpackages" ;
290- case BCLog::LogFlags::ALL:
291- return " all" ;
292- }
293- assert (false );
231+ auto it = LOG_CATEGORIES_BY_FLAG.find (category);
232+ assert (it != LOG_CATEGORIES_BY_FLAG.end ());
233+ return it->second ;
294234}
295235
296236static std::optional<BCLog::Level> GetLogLevel (const std::string& level_str)
@@ -312,18 +252,11 @@ static std::optional<BCLog::Level> GetLogLevel(const std::string& level_str)
312252
313253std::vector<LogCategory> BCLog::Logger::LogCategoriesList () const
314254{
315- // Sort log categories by alphabetical order.
316- std::array<CLogCategoryDesc, std::size (LogCategories)> categories;
317- std::copy (std::begin (LogCategories), std::end (LogCategories), categories.begin ());
318- std::sort (categories.begin (), categories.end (), [](auto a, auto b) { return a.category < b.category ; });
319-
320255 std::vector<LogCategory> ret;
321- for (const CLogCategoryDesc& category_desc : categories) {
322- if (category_desc.flag == BCLog::NONE || category_desc.flag == BCLog::ALL) continue ;
323- LogCategory catActive;
324- catActive.category = category_desc.category ;
325- catActive.active = WillLogCategory (category_desc.flag );
326- ret.push_back (catActive);
256+ for (const auto & [category, flag] : LOG_CATEGORIES_BY_STR) {
257+ if (flag != BCLog::NONE && flag != BCLog::ALL) {
258+ ret.push_back (LogCategory{.category = category, .active = WillLogCategory (flag)});
259+ }
327260 }
328261 return ret;
329262}
0 commit comments