9
9
#include < util/threadnames.h>
10
10
#include < util/time.h>
11
11
12
- #include < algorithm>
13
12
#include < array>
14
- #include < mutex >
13
+ #include < map >
15
14
#include < optional>
16
15
17
16
const char * const DEFAULT_DEBUGLOGFILE = " debug.log" ;
@@ -142,49 +141,58 @@ bool BCLog::Logger::DefaultShrinkDebugFile() const
142
141
return m_categories == BCLog::NONE;
143
142
}
144
143
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},
178
171
#ifdef DEBUG_LOCKCONTENTION
179
- {BCLog::LOCK, " lock " },
172
+ {" lock " , BCLog::LOCK},
180
173
#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)
188
196
};
189
197
190
198
bool GetLogCategory (BCLog::LogFlags& flag, const std::string& str)
@@ -193,11 +201,10 @@ bool GetLogCategory(BCLog::LogFlags& flag, const std::string& str)
193
201
flag = BCLog::ALL;
194
202
return true ;
195
203
}
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 ;
201
208
}
202
209
return false ;
203
210
}
@@ -221,76 +228,9 @@ std::string BCLog::Logger::LogLevelToStr(BCLog::Level level)
221
228
222
229
std::string LogCategoryToStr (BCLog::LogFlags category)
223
230
{
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 ;
294
234
}
295
235
296
236
static 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)
312
252
313
253
std::vector<LogCategory> BCLog::Logger::LogCategoriesList () const
314
254
{
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
-
320
255
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
+ }
327
260
}
328
261
return ret;
329
262
}
0 commit comments