Coverage Report

Created: 2026-04-29 19:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/logging.h
Line
Count
Source
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-present The Bitcoin Core developers
3
// Distributed under the MIT software license, see the accompanying
4
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6
#ifndef BITCOIN_LOGGING_H
7
#define BITCOIN_LOGGING_H
8
9
#include <crypto/siphash.h>
10
#include <logging/categories.h> // IWYU pragma: export
11
#include <span.h>
12
#include <util/byte_units.h>
13
#include <util/fs.h>
14
#include <util/log.h> // IWYU pragma: export
15
#include <util/stdmutex.h>
16
#include <util/string.h>
17
#include <util/time.h>
18
19
#include <atomic>
20
#include <cstdint>
21
#include <cstring>
22
#include <functional>
23
#include <list>
24
#include <memory>
25
#include <optional>
26
#include <string>
27
#include <unordered_map>
28
#include <vector>
29
30
static const bool DEFAULT_LOGTIMEMICROS = false;
31
static const bool DEFAULT_LOGIPS        = false;
32
static const bool DEFAULT_LOGTIMESTAMPS = true;
33
static const bool DEFAULT_LOGTHREADNAMES = false;
34
static const bool DEFAULT_LOGSOURCELOCATIONS = false;
35
static constexpr bool DEFAULT_LOGLEVELALWAYS = false;
36
extern const char * const DEFAULT_DEBUGLOGFILE;
37
38
extern bool fLogIPs;
39
40
struct SourceLocationEqual {
41
    bool operator()(const SourceLocation& lhs, const SourceLocation& rhs) const noexcept
42
75
    {
43
75
        return lhs.line() == rhs.line() && std::string_view(lhs.file_name()) == std::string_view(rhs.file_name());
44
75
    }
45
};
46
47
struct SourceLocationHasher {
48
    size_t operator()(const SourceLocation& s) const noexcept
49
188
    {
50
        // Use CSipHasher(0, 0) as a simple way to get uniform distribution.
51
188
        return size_t(CSipHasher(0, 0)
52
188
                      .Write(s.line())
53
188
                      .Write(MakeUCharSpan(std::string_view{s.file_name()}))
54
188
                      .Finalize());
55
188
    }
56
};
57
58
struct LogCategory {
59
    std::string category;
60
    bool active;
61
};
62
63
namespace BCLog {
64
    constexpr auto DEFAULT_LOG_LEVEL{Level::Debug};
65
    constexpr size_t DEFAULT_MAX_LOG_BUFFER{1'000'000}; // buffer up to 1MB of log data prior to StartLogging
66
    constexpr uint64_t RATELIMIT_MAX_BYTES{1_MiB}; // maximum number of bytes per source location that can be logged within the RATELIMIT_WINDOW
67
    constexpr auto RATELIMIT_WINDOW{1h}; // time window after which log ratelimit stats are reset
68
    constexpr bool DEFAULT_LOGRATELIMIT{true};
69
70
    //! Fixed window rate limiter for logging.
71
    class LogRateLimiter
72
    {
73
    public:
74
        //! Keeps track of an individual source location and how many available bytes are left for logging from it.
75
        struct Stats {
76
            //! Remaining bytes
77
            uint64_t m_available_bytes;
78
            //! Number of bytes that were consumed but didn't fit in the available bytes.
79
            uint64_t m_dropped_bytes{0};
80
81
49
            Stats(uint64_t max_bytes) : m_available_bytes{max_bytes} {}
82
            //! Updates internal accounting and returns true if enough available_bytes were remaining
83
            bool Consume(uint64_t bytes);
84
        };
85
86
    private:
87
        mutable StdMutex m_mutex;
88
89
        //! Stats for each source location that has attempted to log something.
90
        std::unordered_map<SourceLocation, Stats, SourceLocationHasher, SourceLocationEqual> m_source_locations GUARDED_BY(m_mutex);
91
        //! Whether any log locations are suppressed. Cached view on m_source_locations for performance reasons.
92
        std::atomic<bool> m_suppression_active{false};
93
        LogRateLimiter(uint64_t max_bytes, std::chrono::seconds reset_window);
94
95
    public:
96
        using SchedulerFunction = std::function<void(std::function<void()>, std::chrono::milliseconds)>;
97
        /**
98
         * @param scheduler_func    Callable object used to schedule resetting the window. The first
99
         *                          parameter is the function to be executed, and the second is the
100
         *                          reset_window interval.
101
         * @param max_bytes         Maximum number of bytes that can be logged for each source
102
         *                          location.
103
         * @param reset_window      Time window after which the stats are reset.
104
         */
105
        static std::shared_ptr<LogRateLimiter> Create(
106
            SchedulerFunction&& scheduler_func,
107
            uint64_t max_bytes,
108
            std::chrono::seconds reset_window);
109
        //! Maximum number of bytes logged per location per window.
110
        const uint64_t m_max_bytes;
111
        //! Interval after which the window is reset.
112
        const std::chrono::seconds m_reset_window;
113
        //! Suppression status of a source log location.
114
        enum class Status {
115
            UNSUPPRESSED,     // string fits within the limit
116
            NEWLY_SUPPRESSED, // suppression has started since this string
117
            STILL_SUPPRESSED, // suppression is still ongoing
118
        };
119
        //! Consumes `source_loc`'s available bytes corresponding to the size of the (formatted)
120
        //! `str` and returns its status.
121
        [[nodiscard]] Status Consume(
122
            const SourceLocation& source_loc,
123
            const std::string& str) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
124
        //! Resets all usage to zero. Called periodically by the scheduler.
125
        void Reset() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
126
        //! Returns true if any log locations are currently being suppressed.
127
174
        bool SuppressionsActive() const { return m_suppression_active; }
128
    };
129
130
    class Logger
131
    {
132
    private:
133
        mutable StdMutex m_cs; // Can not use Mutex from sync.h because in debug mode it would cause a deadlock when a potential deadlock was detected
134
135
        FILE* m_fileout GUARDED_BY(m_cs) = nullptr;
136
        std::list<util::log::Entry> m_msgs_before_open GUARDED_BY(m_cs);
137
        bool m_buffering GUARDED_BY(m_cs) = true; //!< Buffer messages before logging can be started.
138
        size_t m_max_buffer_memusage GUARDED_BY(m_cs){DEFAULT_MAX_LOG_BUFFER};
139
        size_t m_cur_buffer_memusage GUARDED_BY(m_cs){0};
140
        size_t m_buffer_lines_discarded GUARDED_BY(m_cs){0};
141
142
        //! Manages the rate limiting of each log location.
143
        std::shared_ptr<LogRateLimiter> m_limiter GUARDED_BY(m_cs);
144
145
        //! Category-specific log level. Overrides `m_log_level`.
146
        std::unordered_map<LogFlags, Level> m_category_log_levels GUARDED_BY(m_cs);
147
148
        //! If there is no category-specific log level, all logs with a severity
149
        //! level lower than `m_log_level` will be ignored.
150
        std::atomic<Level> m_log_level{DEFAULT_LOG_LEVEL};
151
152
        /** Log categories bitfield. */
153
        std::atomic<CategoryMask> m_categories{BCLog::NONE};
154
155
        std::string Format(const util::log::Entry& entry) const;
156
157
        std::string LogTimestampStr(SystemClock::time_point now, std::chrono::seconds mocktime) const;
158
159
        /** Slots that connect to the print signal */
160
        std::list<std::function<void(const std::string&)>> m_print_callbacks GUARDED_BY(m_cs){};
161
162
        /** Send an entry to the log output (internal) */
163
        void LogPrint_(util::log::Entry log_entry) EXCLUSIVE_LOCKS_REQUIRED(m_cs);
164
165
        std::string GetLogPrefix(LogFlags category, Level level) const;
166
167
    public:
168
        bool m_print_to_console = false;
169
        bool m_print_to_file = false;
170
171
        bool m_log_timestamps = DEFAULT_LOGTIMESTAMPS;
172
        bool m_log_time_micros = DEFAULT_LOGTIMEMICROS;
173
        bool m_log_threadnames = DEFAULT_LOGTHREADNAMES;
174
        bool m_log_sourcelocations = DEFAULT_LOGSOURCELOCATIONS;
175
        bool m_always_print_category_level = DEFAULT_LOGLEVELALWAYS;
176
177
        fs::path m_file_path;
178
        std::atomic<bool> m_reopen_file{false};
179
180
        /** Send an entry to the log output */
181
        void LogPrint(util::log::Entry log_entry) EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
182
183
        /** Returns whether logs will be written to any output */
184
        bool Enabled() const EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
185
5.25M
        {
186
5.25M
            STDLOCK(m_cs);
187
5.25M
            return m_buffering || m_print_to_console || m_print_to_file || !m_print_callbacks.empty();
188
5.25M
        }
189
190
        /** Connect a slot to the print signal and return the connection */
191
        std::list<std::function<void(const std::string&)>>::iterator PushBackCallback(std::function<void(const std::string&)> fun) EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
192
63
        {
193
63
            STDLOCK(m_cs);
194
63
            m_print_callbacks.push_back(std::move(fun));
195
63
            return --m_print_callbacks.end();
196
63
        }
197
198
        /** Delete a connection */
199
        void DeleteCallback(std::list<std::function<void(const std::string&)>>::iterator it) EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
200
63
        {
201
63
            STDLOCK(m_cs);
202
63
            m_print_callbacks.erase(it);
203
63
        }
204
205
        size_t NumConnections() EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
206
0
        {
207
0
            STDLOCK(m_cs);
208
0
            return m_print_callbacks.size();
209
0
        }
210
211
        /** Start logging (and flush all buffered messages) */
212
        bool StartLogging() EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
213
        /** Only for testing */
214
        void DisconnectTestLogger() EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
215
216
        void SetRateLimiting(std::shared_ptr<LogRateLimiter> limiter) EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
217
14
        {
218
14
            STDLOCK(m_cs);
219
14
            m_limiter = std::move(limiter);
220
14
        }
221
222
        /** Disable logging
223
         * This offers a slight speedup and slightly smaller memory usage
224
         * compared to leaving the logging system in its default state.
225
         * Mostly intended for libbitcoin-kernel apps that don't want any logging.
226
         * Should be used instead of StartLogging().
227
         */
228
        void DisableLogging() EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
229
230
        void ShrinkDebugFile();
231
232
        std::unordered_map<LogFlags, Level> CategoryLevels() const EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
233
8
        {
234
8
            STDLOCK(m_cs);
235
8
            return m_category_log_levels;
236
8
        }
237
        void SetCategoryLogLevel(const std::unordered_map<LogFlags, Level>& levels) EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
238
15
        {
239
15
            STDLOCK(m_cs);
240
15
            m_category_log_levels = levels;
241
15
        }
242
        void AddCategoryLogLevel(LogFlags category, Level level) EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
243
0
        {
244
0
            STDLOCK(m_cs);
245
0
            m_category_log_levels[category] = level;
246
0
        }
247
        bool SetCategoryLogLevel(std::string_view category_str, std::string_view level_str) EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
248
249
5.24M
        Level LogLevel() const { return m_log_level.load(); }
250
22
        void SetLogLevel(Level level) { m_log_level = level; }
251
        bool SetLogLevel(std::string_view level);
252
253
26
        CategoryMask GetCategoryMask() const { return m_categories.load(); }
254
255
        void EnableCategory(LogFlags flag);
256
        bool EnableCategory(std::string_view str);
257
        void DisableCategory(LogFlags flag);
258
        bool DisableCategory(std::string_view str);
259
260
        bool WillLogCategory(LogFlags category) const;
261
        bool WillLogCategoryLevel(LogFlags category, Level level) const EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
262
263
        /** Returns a vector of the log categories in alphabetical order. */
264
        std::vector<LogCategory> LogCategoriesList() const;
265
        /** Returns a string with the log categories in alphabetical order. */
266
        std::string LogCategoriesString() const
267
6.01k
        {
268
186k
            return util::Join(LogCategoriesList(), ", ", [&](const LogCategory& i) { return i.category; });
269
6.01k
        };
270
271
        //! Returns a string with all user-selectable log levels.
272
        std::string LogLevelsString() const;
273
274
        //! Returns the string representation of a log level.
275
        static std::string LogLevelToStr(BCLog::Level level);
276
277
        bool DefaultShrinkDebugFile() const;
278
    };
279
280
} // namespace BCLog
281
282
BCLog::Logger& LogInstance();
283
284
/** Return true if log accepts specified category, at the specified level. */
285
static inline bool LogAcceptCategory(BCLog::LogFlags category, BCLog::Level level)
286
57.2k
{
287
57.2k
    return LogInstance().WillLogCategoryLevel(category, level);
288
57.2k
}
Unexecuted instantiation: addrman_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: getarg_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: i2p_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: logging_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: node_init_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: threadpool_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: validation_chainstate_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: validation_chainstatemanager_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: wallet_test_fixture.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: db_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: coinselector_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: coinselection_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: feebumper_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: group_outputs_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: ismine_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: psbt_wallet_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: scriptpubkeyman_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: spend_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: wallet_rpc_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: wallet_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: wallet_transaction_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: walletdb_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: walletload_tests.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: logging.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: random.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: setup_common.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: util.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: addrdb.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: addrman.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: banman.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
blockencodings.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Line
Count
Source
286
16.8k
{
287
16.8k
    return LogInstance().WillLogCategoryLevel(category, level);
288
16.8k
}
dbwrapper.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Line
Count
Source
286
35.8k
{
287
35.8k
    return LogInstance().WillLogCategoryLevel(category, level);
288
35.8k
}
Unexecuted instantiation: headerssync.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: httpserver.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: i2p.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: blockfilterindex.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: coinstatsindex.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: txospenderindex.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: init.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: mapport.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: net.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
net_processing.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Line
Count
Source
286
610
{
287
610
    return LogInstance().WillLogCategoryLevel(category, level);
288
610
}
Unexecuted instantiation: netgroup.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: abort.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: caches.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: chainstatemanager_args.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: interfaces.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: kernel_notifications.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: mempool_args.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: mempool_persist.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: miner.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: minisketchwrapper.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: timeoffsets.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: txdownloadman_impl.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: txorphanage.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: txreconciliation.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: noui.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: block_policy_estimator.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: node.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: server.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: torcontrol.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: httprpc.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
coinselection.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Line
Count
Source
286
2.78k
{
287
2.78k
    return LogInstance().WillLogCategoryLevel(category, level);
288
2.78k
}
Unexecuted instantiation: load.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: migrate.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: receive.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: wallet.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: scriptpubkeyman.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: spend.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
sqlite.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Line
Count
Source
286
1.15k
{
287
1.15k
    return LogInstance().WillLogCategoryLevel(category, level);
288
1.15k
}
Unexecuted instantiation: walletdb.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: walletutil.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: db.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: external_signer_scriptpubkeyman.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: feebumper.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: fees.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: addresses.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: backup.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: coins.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: encrypt.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: signmessage.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: transactions.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: ipc_test.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
protocol.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Line
Count
Source
286
11
{
287
11
    return LogInstance().WillLogCategoryLevel(category, level);
288
11
}
Unexecuted instantiation: process.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: init.capnp.proxy-client.c++:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: init.capnp.proxy-types.c++:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: init.capnp.proxy-server.c++:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: chainparams.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: args.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: config.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: netif.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: pcp.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: system.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: common.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: net_types.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: netbase.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: request.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: signingprovider.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
Unexecuted instantiation: bitcoind.cpp:LogAcceptCategory(BCLog::LogFlags, util::log::Level)
289
290
/// Return log flag if str parses as a log category.
291
std::optional<BCLog::LogFlags> GetLogCategory(std::string_view str);
292
293
#endif // BITCOIN_LOGGING_H