diff --git a/build/config.go b/build/config.go index e937614165..74a2375663 100644 --- a/build/config.go +++ b/build/config.go @@ -25,8 +25,9 @@ const ( // //nolint:ll type LogConfig struct { - Console *consoleLoggerCfg `group:"console" namespace:"console" description:"The logger writing to stdout and stderr."` - File *FileLoggerConfig `group:"file" namespace:"file" description:"The logger writing to LND's standard log file."` + Console *consoleLoggerCfg `group:"console" namespace:"console" description:"The logger writing to stdout and stderr."` + File *FileLoggerConfig `group:"file" namespace:"file" description:"The logger writing to LND's standard log file."` + NoCommitHash bool `long:"no-commit-hash" description:"If set, the commit-hash of the current build will not be included in log lines by default."` } // Validate validates the LogConfig struct values. diff --git a/build/version.go b/build/version.go index 1238d35a2b..632ebafce4 100644 --- a/build/version.go +++ b/build/version.go @@ -6,9 +6,13 @@ package build import ( + "context" + "encoding/hex" "fmt" "runtime/debug" "strings" + + "github.com/btcsuite/btclog/v2" ) var ( @@ -101,3 +105,28 @@ func Tags() []string { return strings.Split(RawTags, ",") } + +// WithBuildInfo derives a child context with the build information attached as +// attributes. At the moment, this only includes the current build's commit +// hash. +func WithBuildInfo(ctx context.Context, cfg *LogConfig) (context.Context, + error) { + + if cfg.NoCommitHash { + return ctx, nil + } + + // Convert the commit hash to a byte slice. + commitHash, err := hex.DecodeString(CommitHash) + if err != nil { + return nil, fmt.Errorf("unable to decode commit hash: %w", err) + } + + // Include the first 3 bytes of the commit hash in the context as an + // slog attribute. + if len(commitHash) > 3 { + commitHash = commitHash[:3] + } + + return btclog.WithCtx(ctx, btclog.Hex("rev", commitHash)), nil +} diff --git a/lnd.go b/lnd.go index 77456fa153..5fa84e30b9 100644 --- a/lnd.go +++ b/lnd.go @@ -155,6 +155,15 @@ func Main(cfg *Config, lisCfg ListenerCfg, implCfg *ImplementationCfg, } }() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ctx, err := build.WithBuildInfo(ctx, cfg.LogConfig) + if err != nil { + return fmt.Errorf("unable to add build info to context: %w", + err) + } + mkErr := func(format string, args ...interface{}) error { ltndLog.Errorf("Shutting down because error in main "+ "method: "+format, args...) @@ -188,10 +197,6 @@ func Main(cfg *Config, lisCfg ListenerCfg, implCfg *ImplementationCfg, strings.Title(BitcoinChainName), network, ) - ctx := context.Background() - ctx, cancel := context.WithCancel(ctx) - defer cancel() - // Enable http profiling server if requested. if cfg.Pprof.Profile != "" { // Create the http handler. diff --git a/lntest/node/config.go b/lntest/node/config.go index 1e8129e7d8..32f24395b6 100644 --- a/lntest/node/config.go +++ b/lntest/node/config.go @@ -203,6 +203,7 @@ func (cfg *BaseNodeConfig) GenArgs() []string { "--bitcoin.defaultchanconfs=1", "--accept-keysend", "--keep-failed-payment-attempts", + "--logging.no-commit-hash", fmt.Sprintf("--db.batch-commit-interval=%v", commitInterval), fmt.Sprintf("--bitcoin.defaultremotedelay=%v", DefaultCSV), fmt.Sprintf("--rpclisten=%v", cfg.RPCAddr()), diff --git a/sample-lnd.conf b/sample-lnd.conf index 4d3da37796..86ea824858 100644 --- a/sample-lnd.conf +++ b/sample-lnd.conf @@ -994,6 +994,11 @@ [logging] +; Whether to exclude the current build's commit hash from log lines. Note that +; the commit hash will not currently show up in all LND log lines as this new +; feature will take a few versions to propagate through the codebase. +; logging.no-commit-hash=false + ; Disable logging to stdout and stderror. ; logging.console.disable=false