• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lightningnetwork / lnd / 17061620295

19 Aug 2025 06:36AM UTC coverage: 66.755% (-0.01%) from 66.767%
17061620295

Pull #10168

github

web-flow
Merge 1fb284fa2 into 9a4968656
Pull Request #10168: move pgp check to daily builds

135947 of 203651 relevant lines covered (66.75%)

21453.44 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.92
/log.go
1
package lnd
2

3
import (
4
        "github.com/btcsuite/btcd/connmgr"
5
        "github.com/btcsuite/btcd/rpcclient"
6
        btclogv1 "github.com/btcsuite/btclog"
7
        "github.com/btcsuite/btclog/v2"
8
        "github.com/lightninglabs/neutrino"
9
        sphinx "github.com/lightningnetwork/lightning-onion"
10
        "github.com/lightningnetwork/lnd/autopilot"
11
        "github.com/lightningnetwork/lnd/build"
12
        "github.com/lightningnetwork/lnd/chainio"
13
        "github.com/lightningnetwork/lnd/chainntnfs"
14
        "github.com/lightningnetwork/lnd/chainreg"
15
        "github.com/lightningnetwork/lnd/chanacceptor"
16
        "github.com/lightningnetwork/lnd/chanbackup"
17
        "github.com/lightningnetwork/lnd/chanfitness"
18
        "github.com/lightningnetwork/lnd/channeldb"
19
        "github.com/lightningnetwork/lnd/channelnotifier"
20
        "github.com/lightningnetwork/lnd/cluster"
21
        "github.com/lightningnetwork/lnd/contractcourt"
22
        "github.com/lightningnetwork/lnd/discovery"
23
        "github.com/lightningnetwork/lnd/funding"
24
        "github.com/lightningnetwork/lnd/graph"
25
        graphdb "github.com/lightningnetwork/lnd/graph/db"
26
        "github.com/lightningnetwork/lnd/healthcheck"
27
        "github.com/lightningnetwork/lnd/htlcswitch"
28
        "github.com/lightningnetwork/lnd/invoices"
29
        "github.com/lightningnetwork/lnd/kvdb/sqlbase"
30
        "github.com/lightningnetwork/lnd/lncfg"
31
        "github.com/lightningnetwork/lnd/lnrpc/autopilotrpc"
32
        "github.com/lightningnetwork/lnd/lnrpc/chainrpc"
33
        "github.com/lightningnetwork/lnd/lnrpc/devrpc"
34
        "github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
35
        "github.com/lightningnetwork/lnd/lnrpc/neutrinorpc"
36
        "github.com/lightningnetwork/lnd/lnrpc/peersrpc"
37
        "github.com/lightningnetwork/lnd/lnrpc/routerrpc"
38
        "github.com/lightningnetwork/lnd/lnrpc/signrpc"
39
        "github.com/lightningnetwork/lnd/lnrpc/verrpc"
40
        "github.com/lightningnetwork/lnd/lnrpc/walletrpc"
41
        "github.com/lightningnetwork/lnd/lnwallet"
42
        "github.com/lightningnetwork/lnd/lnwallet/btcwallet"
43
        "github.com/lightningnetwork/lnd/lnwallet/chancloser"
44
        "github.com/lightningnetwork/lnd/lnwallet/chanfunding"
45
        "github.com/lightningnetwork/lnd/lnwallet/rpcwallet"
46
        "github.com/lightningnetwork/lnd/monitoring"
47
        "github.com/lightningnetwork/lnd/msgmux"
48
        "github.com/lightningnetwork/lnd/netann"
49
        paymentsdb "github.com/lightningnetwork/lnd/payments/db"
50
        "github.com/lightningnetwork/lnd/peer"
51
        "github.com/lightningnetwork/lnd/peernotifier"
52
        "github.com/lightningnetwork/lnd/protofsm"
53
        "github.com/lightningnetwork/lnd/routing"
54
        "github.com/lightningnetwork/lnd/routing/blindedpath"
55
        "github.com/lightningnetwork/lnd/routing/localchans"
56
        "github.com/lightningnetwork/lnd/rpcperms"
57
        "github.com/lightningnetwork/lnd/signal"
58
        "github.com/lightningnetwork/lnd/sqldb"
59
        "github.com/lightningnetwork/lnd/sweep"
60
        "github.com/lightningnetwork/lnd/tor"
61
        "github.com/lightningnetwork/lnd/watchtower"
62
        "github.com/lightningnetwork/lnd/watchtower/wtclient"
63
)
64

65
// replaceableLogger is a thin wrapper around a logger that is used so the
66
// logger can be replaced easily without some black pointer magic.
67
type replaceableLogger struct {
68
        btclog.Logger
69
        subsystem string
70
}
71

72
// Loggers can not be used before the log rotator has been initialized with a
73
// log file. This must be performed early during application startup by
74
// calling InitLogRotator() on the main log writer instance in the config.
75
var (
76
        // lndPkgLoggers is a list of all lnd package level loggers that are
77
        // registered. They are tracked here so they can be replaced once the
78
        // SetupLoggers function is called with the final root logger.
79
        lndPkgLoggers []*replaceableLogger
80

81
        // addLndPkgLogger is a helper function that creates a new replaceable
82
        // main lnd package level logger and adds it to the list of loggers that
83
        // are replaced again later, once the final root logger is ready.
84
        addLndPkgLogger = func(subsystem string) *replaceableLogger {
18✔
85
                l := &replaceableLogger{
18✔
86
                        Logger:    build.NewSubLogger(subsystem, nil),
18✔
87
                        subsystem: subsystem,
18✔
88
                }
18✔
89
                lndPkgLoggers = append(lndPkgLoggers, l)
18✔
90
                return l
18✔
91
        }
18✔
92

93
        // Loggers that need to be accessible from the lnd package can be placed
94
        // here. Loggers that are only used in sub modules can be added directly
95
        // by using the addSubLogger method. We declare all loggers so we never
96
        // run into a nil reference if they are used early. But the SetupLoggers
97
        // function should always be called as soon as possible to finish
98
        // setting them up properly with a root logger.
99
        ltndLog = addLndPkgLogger("LTND")
100
        rpcsLog = addLndPkgLogger("RPCS")
101
        srvrLog = addLndPkgLogger("SRVR")
102
        atplLog = addLndPkgLogger("ATPL")
103
        acsmLog = addLndPkgLogger("ACSM")
104
)
105

106
// genSubLogger creates a logger for a subsystem. We provide an instance of
107
// a signal.Interceptor to be able to shutdown in the case of a critical error.
108
func genSubLogger(root *build.SubLoggerManager,
109
        interceptor signal.Interceptor) func(string) btclog.Logger {
3✔
110

3✔
111
        // Create a shutdown function which will request shutdown from our
3✔
112
        // interceptor if it is listening.
3✔
113
        shutdown := func() {
3✔
114
                if !interceptor.Listening() {
×
115
                        return
×
116
                }
×
117

118
                interceptor.RequestShutdown()
×
119
        }
120

121
        // Return a function which will create a sublogger from our root
122
        // logger without shutdown fn.
123
        return func(tag string) btclog.Logger {
6✔
124
                return root.GenSubLogger(tag, shutdown)
3✔
125
        }
3✔
126
}
127

128
// SetupLoggers initializes all package-global logger variables.
129
//
130
//nolint:ll
131
func SetupLoggers(root *build.SubLoggerManager, interceptor signal.Interceptor) {
3✔
132
        genLogger := genSubLogger(root, interceptor)
3✔
133

3✔
134
        // Now that we have the proper root logger, we can replace the
3✔
135
        // placeholder lnd package loggers.
3✔
136
        for _, l := range lndPkgLoggers {
6✔
137
                l.Logger = build.NewSubLogger(l.subsystem, genLogger)
3✔
138
                SetSubLogger(root, l.subsystem, l.Logger)
3✔
139
        }
3✔
140

141
        // Initialize loggers from packages outside of `lnd` first. The
142
        // packages below will overwrite the names of the loggers they import.
143
        // For instance, the logger in `neutrino.query` is overwritten by
144
        // `btcwallet.chain`, which is overwritten by `lnwallet`. To ensure the
145
        // overwriting works, we need to initialize the loggers here so they
146
        // can be overwritten later.
147
        AddV1SubLogger(root, "BTCN", interceptor, neutrino.UseLogger)
3✔
148
        AddV1SubLogger(root, "CMGR", interceptor, connmgr.UseLogger)
3✔
149
        AddV1SubLogger(root, "RPCC", interceptor, rpcclient.UseLogger)
3✔
150

3✔
151
        // Some of the loggers declared in the main lnd package are also used
3✔
152
        // in sub packages.
3✔
153
        signal.UseLogger(ltndLog)
3✔
154
        autopilot.UseLogger(atplLog)
3✔
155

3✔
156
        AddSubLogger(root, "LNWL", interceptor, lnwallet.UseLogger)
3✔
157
        AddSubLogger(root, "DISC", interceptor, discovery.UseLogger)
3✔
158
        AddSubLogger(root, "NTFN", interceptor, chainntnfs.UseLogger)
3✔
159
        AddSubLogger(root, "CHDB", interceptor, channeldb.UseLogger)
3✔
160
        AddSubLogger(root, "SQLB", interceptor, sqlbase.UseLogger)
3✔
161
        AddSubLogger(root, "HSWC", interceptor, htlcswitch.UseLogger)
3✔
162
        AddSubLogger(root, "CNCT", interceptor, contractcourt.UseLogger)
3✔
163
        AddSubLogger(root, "UTXN", interceptor, contractcourt.UseNurseryLogger)
3✔
164
        AddSubLogger(root, "BRAR", interceptor, contractcourt.UseBreachLogger)
3✔
165
        AddV1SubLogger(root, "SPHX", interceptor, sphinx.UseLogger)
3✔
166
        AddSubLogger(root, "SWPR", interceptor, sweep.UseLogger)
3✔
167
        AddSubLogger(root, "SGNR", interceptor, signrpc.UseLogger)
3✔
168
        AddSubLogger(root, "WLKT", interceptor, walletrpc.UseLogger)
3✔
169
        AddSubLogger(root, "ARPC", interceptor, autopilotrpc.UseLogger)
3✔
170
        AddSubLogger(root, "NRPC", interceptor, neutrinorpc.UseLogger)
3✔
171
        AddSubLogger(root, "DRPC", interceptor, devrpc.UseLogger)
3✔
172
        AddSubLogger(root, "INVC", interceptor, invoices.UseLogger)
3✔
173
        AddSubLogger(root, "NANN", interceptor, netann.UseLogger)
3✔
174
        AddSubLogger(root, "WTWR", interceptor, watchtower.UseLogger)
3✔
175
        AddSubLogger(root, "NTFR", interceptor, chainrpc.UseLogger)
3✔
176
        AddSubLogger(root, "IRPC", interceptor, invoicesrpc.UseLogger)
3✔
177
        AddSubLogger(root, "CHNF", interceptor, channelnotifier.UseLogger)
3✔
178
        AddSubLogger(root, "CHBU", interceptor, chanbackup.UseLogger)
3✔
179
        AddSubLogger(root, "PROM", interceptor, monitoring.UseLogger)
3✔
180
        AddSubLogger(root, "WTCL", interceptor, wtclient.UseLogger)
3✔
181
        AddSubLogger(root, "PRNF", interceptor, peernotifier.UseLogger)
3✔
182
        AddSubLogger(root, "CHFD", interceptor, chanfunding.UseLogger)
3✔
183
        AddSubLogger(root, "PEER", interceptor, peer.UseLogger)
3✔
184
        AddSubLogger(root, "CHCL", interceptor, chancloser.UseLogger)
3✔
185
        AddSubLogger(root, "LCHN", interceptor, localchans.UseLogger)
3✔
186
        AddSubLogger(root, "PFSM", interceptor, protofsm.UseLogger)
3✔
187

3✔
188
        AddSubLogger(root, routing.Subsystem, interceptor, routing.UseLogger)
3✔
189
        AddSubLogger(root, routerrpc.Subsystem, interceptor, routerrpc.UseLogger)
3✔
190
        AddSubLogger(root, chanfitness.Subsystem, interceptor, chanfitness.UseLogger)
3✔
191
        AddSubLogger(root, verrpc.Subsystem, interceptor, verrpc.UseLogger)
3✔
192
        AddSubLogger(root, healthcheck.Subsystem, interceptor, healthcheck.UseLogger)
3✔
193
        AddSubLogger(root, chainreg.Subsystem, interceptor, chainreg.UseLogger)
3✔
194
        AddSubLogger(root, chanacceptor.Subsystem, interceptor, chanacceptor.UseLogger)
3✔
195
        AddSubLogger(root, funding.Subsystem, interceptor, funding.UseLogger)
3✔
196
        AddSubLogger(root, cluster.Subsystem, interceptor, cluster.UseLogger)
3✔
197
        AddSubLogger(root, rpcperms.Subsystem, interceptor, rpcperms.UseLogger)
3✔
198
        AddSubLogger(root, tor.Subsystem, interceptor, tor.UseLogger)
3✔
199
        AddSubLogger(root, btcwallet.Subsystem, interceptor, btcwallet.UseLogger)
3✔
200
        AddSubLogger(root, rpcwallet.Subsystem, interceptor, rpcwallet.UseLogger)
3✔
201
        AddSubLogger(root, peersrpc.Subsystem, interceptor, peersrpc.UseLogger)
3✔
202
        AddSubLogger(root, graph.Subsystem, interceptor, graph.UseLogger)
3✔
203
        AddSubLogger(root, lncfg.Subsystem, interceptor, lncfg.UseLogger)
3✔
204
        AddSubLogger(
3✔
205
                root, blindedpath.Subsystem, interceptor, blindedpath.UseLogger,
3✔
206
        )
3✔
207
        AddSubLogger(root, graphdb.Subsystem, interceptor, graphdb.UseLogger)
3✔
208
        AddSubLogger(root, chainio.Subsystem, interceptor, chainio.UseLogger)
3✔
209
        AddSubLogger(root, msgmux.Subsystem, interceptor, msgmux.UseLogger)
3✔
210
        AddSubLogger(root, sqldb.Subsystem, interceptor, sqldb.UseLogger)
3✔
211
        AddSubLogger(
3✔
212
                root, paymentsdb.Subsystem, interceptor, paymentsdb.UseLogger,
3✔
213
        )
3✔
214

215
}
216

217
// AddSubLogger is a helper method to conveniently create and register the
218
// logger of one or more sub systems.
219
func AddSubLogger(root *build.SubLoggerManager, subsystem string,
220
        interceptor signal.Interceptor, useLoggers ...func(btclog.Logger)) {
3✔
221

3✔
222
        // genSubLogger will return a callback for creating a logger instance,
3✔
223
        // which we will give to the root logger.
3✔
224
        genLogger := genSubLogger(root, interceptor)
3✔
225

3✔
226
        // Create and register just a single logger to prevent them from
3✔
227
        // overwriting each other internally.
3✔
228
        logger := build.NewSubLogger(subsystem, genLogger)
3✔
229
        SetSubLogger(root, subsystem, logger, useLoggers...)
3✔
230
}
3✔
231

232
// SetSubLogger is a helper method to conveniently register the logger of a
233
// sub system.
234
func SetSubLogger(root *build.SubLoggerManager, subsystem string,
235
        logger btclog.Logger, useLoggers ...func(btclog.Logger)) {
3✔
236

3✔
237
        root.RegisterSubLogger(subsystem, logger)
3✔
238
        for _, useLogger := range useLoggers {
6✔
239
                useLogger(logger)
3✔
240
        }
3✔
241
}
242

243
// AddV1SubLogger is a helper method to conveniently create and register the
244
// logger of one or more sub systems.
245
func AddV1SubLogger(root *build.SubLoggerManager, subsystem string,
246
        interceptor signal.Interceptor, useLoggers ...func(btclogv1.Logger)) {
3✔
247

3✔
248
        // genSubLogger will return a callback for creating a logger instance,
3✔
249
        // which we will give to the root logger.
3✔
250
        genLogger := genSubLogger(root, interceptor)
3✔
251

3✔
252
        // Create and register just a single logger to prevent them from
3✔
253
        // overwriting each other internally.
3✔
254
        logger := build.NewSubLogger(subsystem, genLogger)
3✔
255
        SetV1SubLogger(root, subsystem, logger, useLoggers...)
3✔
256
}
3✔
257

258
// SetV1SubLogger is a helper method to conveniently register the logger of a
259
// sub system. Note that the btclog v2 logger implements the btclog v1 logger
260
// which is why we can pass the v2 logger to the UseLogger call-backs that
261
// expect the v1 logger.
262
func SetV1SubLogger(root *build.SubLoggerManager, subsystem string,
263
        logger btclog.Logger, useLoggers ...func(btclogv1.Logger)) {
3✔
264

3✔
265
        root.RegisterSubLogger(subsystem, logger)
3✔
266
        for _, useLogger := range useLoggers {
6✔
267
                useLogger(logger)
3✔
268
        }
3✔
269
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc