github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/gopkg.in/mgo.v2/txn/debug.go (about)

     1  package txn
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"sort"
     7  	"sync/atomic"
     8  
     9  	"gopkg.in/mgo.v2/bson"
    10  )
    11  
    12  var (
    13  	debugEnabled bool
    14  	logger       log_Logger
    15  )
    16  
    17  type log_Logger interface {
    18  	Output(calldepth int, s string) error
    19  }
    20  
    21  // Specify the *log.Logger where logged messages should be sent to.
    22  func SetLogger(l log_Logger) {
    23  	logger = l
    24  }
    25  
    26  // SetDebug enables or disables debugging.
    27  func SetDebug(debug bool) {
    28  	debugEnabled = debug
    29  }
    30  
    31  var ErrChaos = fmt.Errorf("interrupted by chaos")
    32  
    33  var debugId uint32
    34  
    35  func debugPrefix() string {
    36  	d := atomic.AddUint32(&debugId, 1) - 1
    37  	s := make([]byte, 0, 10)
    38  	for i := uint(0); i < 8; i++ {
    39  		s = append(s, "abcdefghijklmnop"[(d>>(4*i))&0xf])
    40  		if d>>(4*(i+1)) == 0 {
    41  			break
    42  		}
    43  	}
    44  	s = append(s, ')', ' ')
    45  	return string(s)
    46  }
    47  
    48  func logf(format string, args ...interface{}) {
    49  	if logger != nil {
    50  		logger.Output(2, fmt.Sprintf(format, argsForLog(args)...))
    51  	}
    52  }
    53  
    54  func debugf(format string, args ...interface{}) {
    55  	if debugEnabled && logger != nil {
    56  		logger.Output(2, fmt.Sprintf(format, argsForLog(args)...))
    57  	}
    58  }
    59  
    60  func argsForLog(args []interface{}) []interface{} {
    61  	for i, arg := range args {
    62  		switch v := arg.(type) {
    63  		case bson.ObjectId:
    64  			args[i] = v.Hex()
    65  		case []bson.ObjectId:
    66  			lst := make([]string, len(v))
    67  			for j, id := range v {
    68  				lst[j] = id.Hex()
    69  			}
    70  			args[i] = lst
    71  		case map[docKey][]bson.ObjectId:
    72  			buf := &bytes.Buffer{}
    73  			var dkeys docKeys
    74  			for dkey := range v {
    75  				dkeys = append(dkeys, dkey)
    76  			}
    77  			sort.Sort(dkeys)
    78  			for i, dkey := range dkeys {
    79  				if i > 0 {
    80  					buf.WriteByte(' ')
    81  				}
    82  				buf.WriteString(fmt.Sprintf("%v: {", dkey))
    83  				for j, id := range v[dkey] {
    84  					if j > 0 {
    85  						buf.WriteByte(' ')
    86  					}
    87  					buf.WriteString(id.Hex())
    88  				}
    89  				buf.WriteByte('}')
    90  			}
    91  			args[i] = buf.String()
    92  		case map[docKey][]int64:
    93  			buf := &bytes.Buffer{}
    94  			var dkeys docKeys
    95  			for dkey := range v {
    96  				dkeys = append(dkeys, dkey)
    97  			}
    98  			sort.Sort(dkeys)
    99  			for i, dkey := range dkeys {
   100  				if i > 0 {
   101  					buf.WriteByte(' ')
   102  				}
   103  				buf.WriteString(fmt.Sprintf("%v: %v", dkey, v[dkey]))
   104  			}
   105  			args[i] = buf.String()
   106  		}
   107  	}
   108  	return args
   109  }