decred.org/dcrwallet/v3@v3.1.0/internal/rpc/rpcserver/log.go (about)

     1  // Copyright (c) 2015-2016 The btcsuite developers
     2  // Copyright (c) 2018 The Decred devlopers
     3  //
     4  // Permission to use, copy, modify, and distribute this software for any
     5  // purpose with or without fee is hereby granted, provided that the above
     6  // copyright notice and this permission notice appear in all copies.
     7  //
     8  // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     9  // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    10  // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    11  // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    12  // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    13  // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    14  // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    15  
    16  package rpcserver
    17  
    18  import (
    19  	"os"
    20  	"strings"
    21  
    22  	"github.com/decred/slog"
    23  	"google.golang.org/grpc/grpclog"
    24  )
    25  
    26  // UseLogger sets the logger to use for the gRPC server.
    27  func UseLogger(l slog.Logger) {
    28  	grpclog.SetLogger(logger{l})
    29  }
    30  
    31  // logger uses a slog.Logger to implement the grpclog.Logger interface.
    32  type logger struct {
    33  	slog.Logger
    34  }
    35  
    36  // stripGrpcPrefix removes the package prefix for all logs made to the grpc
    37  // logger, since these are already included as the slog subsystem name.
    38  func stripGrpcPrefix(logstr string) string {
    39  	return strings.TrimPrefix(logstr, "grpc: ")
    40  }
    41  
    42  // stripGrpcPrefixArgs removes the package prefix from the first argument, if it
    43  // exists and is a string, returning the same arg slice after reassigning the
    44  // first arg.
    45  func stripGrpcPrefixArgs(args ...interface{}) []interface{} {
    46  	if len(args) == 0 {
    47  		return args
    48  	}
    49  	firstArgStr, ok := args[0].(string)
    50  	if ok {
    51  		args[0] = stripGrpcPrefix(firstArgStr)
    52  	}
    53  	return args
    54  }
    55  
    56  func (l logger) Fatal(args ...interface{}) {
    57  	l.Critical(stripGrpcPrefixArgs(args)...)
    58  	os.Exit(1)
    59  }
    60  
    61  func (l logger) Fatalf(format string, args ...interface{}) {
    62  	l.Criticalf(stripGrpcPrefix(format), args...)
    63  	os.Exit(1)
    64  }
    65  
    66  func (l logger) Fatalln(args ...interface{}) {
    67  	l.Critical(stripGrpcPrefixArgs(args)...)
    68  	os.Exit(1)
    69  }
    70  
    71  func (l logger) Print(args ...interface{}) {
    72  	l.Info(stripGrpcPrefixArgs(args)...)
    73  }
    74  
    75  func (l logger) Printf(format string, args ...interface{}) {
    76  	l.Infof(stripGrpcPrefix(format), args...)
    77  }
    78  
    79  func (l logger) Println(args ...interface{}) {
    80  	l.Info(stripGrpcPrefixArgs(args)...)
    81  }