mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 05:22:24 -05:00 
			
		
		
		
	[chore] update otel -> v1.20.0 (#2358)
This commit is contained in:
		
					parent
					
						
							
								deaea100c3
							
						
					
				
			
			
				commit
				
					
						7753f42132
					
				
			
		
					 422 changed files with 1814 additions and 6590 deletions
				
			
		
							
								
								
									
										113
									
								
								vendor/github.com/go-logr/logr/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										113
									
								
								vendor/github.com/go-logr/logr/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,6 +1,7 @@ | |||
| # A minimal logging API for Go | ||||
| 
 | ||||
| [](https://pkg.go.dev/github.com/go-logr/logr) | ||||
| [](https://securityscorecards.dev/viewer/?platform=github.com&org=go-logr&repo=logr) | ||||
| 
 | ||||
| logr offers an(other) opinion on how Go programs and libraries can do logging | ||||
| without becoming coupled to a particular logging implementation.  This is not | ||||
|  | @ -73,6 +74,29 @@ received: | |||
| If the Go standard library had defined an interface for logging, this project | ||||
| probably would not be needed.  Alas, here we are. | ||||
| 
 | ||||
| When the Go developers started developing such an interface with | ||||
| [slog](https://github.com/golang/go/issues/56345), they adopted some of the | ||||
| logr design but also left out some parts and changed others: | ||||
| 
 | ||||
| | Feature | logr | slog | | ||||
| |---------|------|------| | ||||
| | High-level API | `Logger` (passed by value) | `Logger` (passed by [pointer](https://github.com/golang/go/issues/59126)) | | ||||
| | Low-level API | `LogSink` | `Handler` | | ||||
| | Stack unwinding | done by `LogSink` | done by `Logger` | | ||||
| | Skipping helper functions | `WithCallDepth`, `WithCallStackHelper` | [not supported by Logger](https://github.com/golang/go/issues/59145) | | ||||
| | Generating a value for logging on demand | `Marshaler` | `LogValuer` | | ||||
| | Log levels | >= 0, higher meaning "less important" | positive and negative, with 0 for "info" and higher meaning "more important" | | ||||
| | Error log entries | always logged, don't have a verbosity level | normal log entries with level >= `LevelError` | | ||||
| | Passing logger via context | `NewContext`, `FromContext` | no API | | ||||
| | Adding a name to a logger | `WithName` | no API | | ||||
| | Modify verbosity of log entries in a call chain | `V` | no API | | ||||
| | Grouping of key/value pairs | not supported | `WithGroup`, `GroupValue` | | ||||
| 
 | ||||
| The high-level slog API is explicitly meant to be one of many different APIs | ||||
| that can be layered on top of a shared `slog.Handler`. logr is one such | ||||
| alternative API, with [interoperability](#slog-interoperability) provided by the [`slogr`](slogr) | ||||
| package. | ||||
| 
 | ||||
| ### Inspiration | ||||
| 
 | ||||
| Before you consider this package, please read [this blog post by the | ||||
|  | @ -118,6 +142,91 @@ There are implementations for the following logging libraries: | |||
| - **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0) | ||||
| - **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing) | ||||
| 
 | ||||
| ## slog interoperability | ||||
| 
 | ||||
| Interoperability goes both ways, using the `logr.Logger` API with a `slog.Handler` | ||||
| and using the `slog.Logger` API with a `logr.LogSink`. [slogr](./slogr) provides `NewLogr` and | ||||
| `NewSlogHandler` API calls to convert between a `logr.Logger` and a `slog.Handler`. | ||||
| As usual, `slog.New` can be used to wrap such a `slog.Handler` in the high-level | ||||
| slog API. `slogr` itself leaves that to the caller. | ||||
| 
 | ||||
| ## Using a `logr.Sink` as backend for slog | ||||
| 
 | ||||
| Ideally, a logr sink implementation should support both logr and slog by | ||||
| implementing both the normal logr interface(s) and `slogr.SlogSink`.  Because | ||||
| of a conflict in the parameters of the common `Enabled` method, it is [not | ||||
| possible to implement both slog.Handler and logr.Sink in the same | ||||
| type](https://github.com/golang/go/issues/59110). | ||||
| 
 | ||||
| If both are supported, log calls can go from the high-level APIs to the backend | ||||
| without the need to convert parameters. `NewLogr` and `NewSlogHandler` can | ||||
| convert back and forth without adding additional wrappers, with one exception: | ||||
| when `Logger.V` was used to adjust the verbosity for a `slog.Handler`, then | ||||
| `NewSlogHandler` has to use a wrapper which adjusts the verbosity for future | ||||
| log calls. | ||||
| 
 | ||||
| Such an implementation should also support values that implement specific | ||||
| interfaces from both packages for logging (`logr.Marshaler`, `slog.LogValuer`, | ||||
| `slog.GroupValue`). logr does not convert those. | ||||
| 
 | ||||
| Not supporting slog has several drawbacks: | ||||
| - Recording source code locations works correctly if the handler gets called | ||||
|   through `slog.Logger`, but may be wrong in other cases. That's because a | ||||
|   `logr.Sink` does its own stack unwinding instead of using the program counter | ||||
|   provided by the high-level API. | ||||
| - slog levels <= 0 can be mapped to logr levels by negating the level without a | ||||
|   loss of information. But all slog levels > 0 (e.g. `slog.LevelWarning` as | ||||
|   used by `slog.Logger.Warn`) must be mapped to 0 before calling the sink | ||||
|   because logr does not support "more important than info" levels. | ||||
| - The slog group concept is supported by prefixing each key in a key/value | ||||
|   pair with the group names, separated by a dot. For structured output like | ||||
|   JSON it would be better to group the key/value pairs inside an object. | ||||
| - Special slog values and interfaces don't work as expected. | ||||
| - The overhead is likely to be higher. | ||||
| 
 | ||||
| These drawbacks are severe enough that applications using a mixture of slog and | ||||
| logr should switch to a different backend. | ||||
| 
 | ||||
| ## Using a `slog.Handler` as backend for logr | ||||
| 
 | ||||
| Using a plain `slog.Handler` without support for logr works better than the | ||||
| other direction: | ||||
| - All logr verbosity levels can be mapped 1:1 to their corresponding slog level | ||||
|   by negating them. | ||||
| - Stack unwinding is done by the `slogr.SlogSink` and the resulting program | ||||
|   counter is passed to the `slog.Handler`. | ||||
| - Names added via `Logger.WithName` are gathered and recorded in an additional | ||||
|   attribute with `logger` as key and the names separated by slash as value. | ||||
| - `Logger.Error` is turned into a log record with `slog.LevelError` as level | ||||
|   and an additional attribute with `err` as key, if an error was provided. | ||||
| 
 | ||||
| The main drawback is that `logr.Marshaler` will not be supported. Types should | ||||
| ideally support both `logr.Marshaler` and `slog.Valuer`. If compatibility | ||||
| with logr implementations without slog support is not important, then | ||||
| `slog.Valuer` is sufficient. | ||||
| 
 | ||||
| ## Context support for slog | ||||
| 
 | ||||
| Storing a logger in a `context.Context` is not supported by | ||||
| slog. `logr.NewContext` and `logr.FromContext` can be used with slog like this | ||||
| to fill this gap: | ||||
| 
 | ||||
|     func HandlerFromContext(ctx context.Context) slog.Handler { | ||||
|         logger, err := logr.FromContext(ctx) | ||||
|         if err == nil { | ||||
|             return slogr.NewSlogHandler(logger) | ||||
|         } | ||||
|         return slog.Default().Handler() | ||||
|     } | ||||
| 
 | ||||
|     func ContextWithHandler(ctx context.Context, handler slog.Handler) context.Context { | ||||
|         return logr.NewContext(ctx, slogr.NewLogr(handler)) | ||||
|     } | ||||
| 
 | ||||
| The downside is that storing and retrieving a `slog.Handler` needs more | ||||
| allocations compared to using a `logr.Logger`. Therefore the recommendation is | ||||
| to use the `logr.Logger` API in code which uses contextual logging. | ||||
| 
 | ||||
| ## FAQ | ||||
| 
 | ||||
| ### Conceptual | ||||
|  | @ -241,7 +350,9 @@ Otherwise, you can start out with `0` as "you always want to see this", | |||
| 
 | ||||
| Then gradually choose levels in between as you need them, working your way | ||||
| down from 10 (for debug and trace style logs) and up from 1 (for chattier | ||||
| info-type logs.) | ||||
| info-type logs). For reference, slog pre-defines -4 for debug logs | ||||
| (corresponds to 4 in logr), which matches what is | ||||
| [recommended for Kubernetes](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md#what-method-to-use). | ||||
| 
 | ||||
| #### How do I choose my keys? | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										18
									
								
								vendor/github.com/go-logr/logr/SECURITY.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/go-logr/logr/SECURITY.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | |||
| # Security Policy | ||||
| 
 | ||||
| If you have discovered a security vulnerability in this project, please report it | ||||
| privately. **Do not disclose it as a public issue.** This gives us time to work with you | ||||
| to fix the issue before public exposure, reducing the chance that the exploit will be | ||||
| used before a patch is released. | ||||
| 
 | ||||
| You may submit the report in the following ways: | ||||
| 
 | ||||
| - send an email to go-logr-security@googlegroups.com | ||||
| - send us a [private vulnerability report](https://github.com/go-logr/logr/security/advisories/new) | ||||
| 
 | ||||
| Please provide the following information in your report: | ||||
| 
 | ||||
| - A description of the vulnerability and its impact | ||||
| - How to reproduce the issue | ||||
| 
 | ||||
| We ask that you give us 90 days to work on a fix before public exposure. | ||||
							
								
								
									
										48
									
								
								vendor/github.com/go-logr/logr/funcr/funcr.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								vendor/github.com/go-logr/logr/funcr/funcr.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -116,17 +116,17 @@ type Options struct { | |||
| 	// Equivalent hooks are offered for key-value pairs saved via | ||||
| 	// logr.Logger.WithValues or Formatter.AddValues (see RenderValuesHook) and | ||||
| 	// for user-provided pairs (see RenderArgsHook). | ||||
| 	RenderBuiltinsHook func(kvList []interface{}) []interface{} | ||||
| 	RenderBuiltinsHook func(kvList []any) []any | ||||
| 
 | ||||
| 	// RenderValuesHook is the same as RenderBuiltinsHook, except that it is | ||||
| 	// only called for key-value pairs saved via logr.Logger.WithValues.  See | ||||
| 	// RenderBuiltinsHook for more details. | ||||
| 	RenderValuesHook func(kvList []interface{}) []interface{} | ||||
| 	RenderValuesHook func(kvList []any) []any | ||||
| 
 | ||||
| 	// RenderArgsHook is the same as RenderBuiltinsHook, except that it is only | ||||
| 	// called for key-value pairs passed directly to Info and Error.  See | ||||
| 	// RenderBuiltinsHook for more details. | ||||
| 	RenderArgsHook func(kvList []interface{}) []interface{} | ||||
| 	RenderArgsHook func(kvList []any) []any | ||||
| 
 | ||||
| 	// MaxLogDepth tells funcr how many levels of nested fields (e.g. a struct | ||||
| 	// that contains a struct, etc.) it may log.  Every time it finds a struct, | ||||
|  | @ -163,7 +163,7 @@ func (l fnlogger) WithName(name string) logr.LogSink { | |||
| 	return &l | ||||
| } | ||||
| 
 | ||||
| func (l fnlogger) WithValues(kvList ...interface{}) logr.LogSink { | ||||
| func (l fnlogger) WithValues(kvList ...any) logr.LogSink { | ||||
| 	l.Formatter.AddValues(kvList) | ||||
| 	return &l | ||||
| } | ||||
|  | @ -173,12 +173,12 @@ func (l fnlogger) WithCallDepth(depth int) logr.LogSink { | |||
| 	return &l | ||||
| } | ||||
| 
 | ||||
| func (l fnlogger) Info(level int, msg string, kvList ...interface{}) { | ||||
| func (l fnlogger) Info(level int, msg string, kvList ...any) { | ||||
| 	prefix, args := l.FormatInfo(level, msg, kvList) | ||||
| 	l.write(prefix, args) | ||||
| } | ||||
| 
 | ||||
| func (l fnlogger) Error(err error, msg string, kvList ...interface{}) { | ||||
| func (l fnlogger) Error(err error, msg string, kvList ...any) { | ||||
| 	prefix, args := l.FormatError(err, msg, kvList) | ||||
| 	l.write(prefix, args) | ||||
| } | ||||
|  | @ -229,7 +229,7 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter { | |||
| type Formatter struct { | ||||
| 	outputFormat outputFormat | ||||
| 	prefix       string | ||||
| 	values       []interface{} | ||||
| 	values       []any | ||||
| 	valuesStr    string | ||||
| 	depth        int | ||||
| 	opts         *Options | ||||
|  | @ -246,10 +246,10 @@ const ( | |||
| ) | ||||
| 
 | ||||
| // PseudoStruct is a list of key-value pairs that gets logged as a struct. | ||||
| type PseudoStruct []interface{} | ||||
| type PseudoStruct []any | ||||
| 
 | ||||
| // render produces a log line, ready to use. | ||||
| func (f Formatter) render(builtins, args []interface{}) string { | ||||
| func (f Formatter) render(builtins, args []any) string { | ||||
| 	// Empirically bytes.Buffer is faster than strings.Builder for this. | ||||
| 	buf := bytes.NewBuffer(make([]byte, 0, 1024)) | ||||
| 	if f.outputFormat == outputJSON { | ||||
|  | @ -292,7 +292,7 @@ func (f Formatter) render(builtins, args []interface{}) string { | |||
| // This function returns a potentially modified version of kvList, which | ||||
| // ensures that there is a value for every key (adding a value if needed) and | ||||
| // that each key is a string (substituting a key if needed). | ||||
| func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing bool, escapeKeys bool) []interface{} { | ||||
| func (f Formatter) flatten(buf *bytes.Buffer, kvList []any, continuing bool, escapeKeys bool) []any { | ||||
| 	// This logic overlaps with sanitize() but saves one type-cast per key, | ||||
| 	// which can be measurable. | ||||
| 	if len(kvList)%2 != 0 { | ||||
|  | @ -334,7 +334,7 @@ func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing b | |||
| 	return kvList | ||||
| } | ||||
| 
 | ||||
| func (f Formatter) pretty(value interface{}) string { | ||||
| func (f Formatter) pretty(value any) string { | ||||
| 	return f.prettyWithFlags(value, 0, 0) | ||||
| } | ||||
| 
 | ||||
|  | @ -343,7 +343,7 @@ const ( | |||
| ) | ||||
| 
 | ||||
| // TODO: This is not fast. Most of the overhead goes here. | ||||
| func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) string { | ||||
| func (f Formatter) prettyWithFlags(value any, flags uint32, depth int) string { | ||||
| 	if depth > f.opts.MaxLogDepth { | ||||
| 		return `"<max-log-depth-exceeded>"` | ||||
| 	} | ||||
|  | @ -614,7 +614,7 @@ func isEmpty(v reflect.Value) bool { | |||
| 	return false | ||||
| } | ||||
| 
 | ||||
| func invokeMarshaler(m logr.Marshaler) (ret interface{}) { | ||||
| func invokeMarshaler(m logr.Marshaler) (ret any) { | ||||
| 	defer func() { | ||||
| 		if r := recover(); r != nil { | ||||
| 			ret = fmt.Sprintf("<panic: %s>", r) | ||||
|  | @ -675,12 +675,12 @@ func (f Formatter) caller() Caller { | |||
| 
 | ||||
| const noValue = "<no-value>" | ||||
| 
 | ||||
| func (f Formatter) nonStringKey(v interface{}) string { | ||||
| func (f Formatter) nonStringKey(v any) string { | ||||
| 	return fmt.Sprintf("<non-string-key: %s>", f.snippet(v)) | ||||
| } | ||||
| 
 | ||||
| // snippet produces a short snippet string of an arbitrary value. | ||||
| func (f Formatter) snippet(v interface{}) string { | ||||
| func (f Formatter) snippet(v any) string { | ||||
| 	const snipLen = 16 | ||||
| 
 | ||||
| 	snip := f.pretty(v) | ||||
|  | @ -693,7 +693,7 @@ func (f Formatter) snippet(v interface{}) string { | |||
| // sanitize ensures that a list of key-value pairs has a value for every key | ||||
| // (adding a value if needed) and that each key is a string (substituting a key | ||||
| // if needed). | ||||
| func (f Formatter) sanitize(kvList []interface{}) []interface{} { | ||||
| func (f Formatter) sanitize(kvList []any) []any { | ||||
| 	if len(kvList)%2 != 0 { | ||||
| 		kvList = append(kvList, noValue) | ||||
| 	} | ||||
|  | @ -727,8 +727,8 @@ func (f Formatter) GetDepth() int { | |||
| // FormatInfo renders an Info log message into strings.  The prefix will be | ||||
| // empty when no names were set (via AddNames), or when the output is | ||||
| // configured for JSON. | ||||
| func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (prefix, argsStr string) { | ||||
| 	args := make([]interface{}, 0, 64) // using a constant here impacts perf | ||||
| func (f Formatter) FormatInfo(level int, msg string, kvList []any) (prefix, argsStr string) { | ||||
| 	args := make([]any, 0, 64) // using a constant here impacts perf | ||||
| 	prefix = f.prefix | ||||
| 	if f.outputFormat == outputJSON { | ||||
| 		args = append(args, "logger", prefix) | ||||
|  | @ -745,10 +745,10 @@ func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (pref | |||
| } | ||||
| 
 | ||||
| // FormatError renders an Error log message into strings.  The prefix will be | ||||
| // empty when no names were set (via AddNames),  or when the output is | ||||
| // empty when no names were set (via AddNames), or when the output is | ||||
| // configured for JSON. | ||||
| func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (prefix, argsStr string) { | ||||
| 	args := make([]interface{}, 0, 64) // using a constant here impacts perf | ||||
| func (f Formatter) FormatError(err error, msg string, kvList []any) (prefix, argsStr string) { | ||||
| 	args := make([]any, 0, 64) // using a constant here impacts perf | ||||
| 	prefix = f.prefix | ||||
| 	if f.outputFormat == outputJSON { | ||||
| 		args = append(args, "logger", prefix) | ||||
|  | @ -761,12 +761,12 @@ func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (pre | |||
| 		args = append(args, "caller", f.caller()) | ||||
| 	} | ||||
| 	args = append(args, "msg", msg) | ||||
| 	var loggableErr interface{} | ||||
| 	var loggableErr any | ||||
| 	if err != nil { | ||||
| 		loggableErr = err.Error() | ||||
| 	} | ||||
| 	args = append(args, "error", loggableErr) | ||||
| 	return f.prefix, f.render(args, kvList) | ||||
| 	return prefix, f.render(args, kvList) | ||||
| } | ||||
| 
 | ||||
| // AddName appends the specified name.  funcr uses '/' characters to separate | ||||
|  | @ -781,7 +781,7 @@ func (f *Formatter) AddName(name string) { | |||
| 
 | ||||
| // AddValues adds key-value pairs to the set of saved values to be logged with | ||||
| // each log line. | ||||
| func (f *Formatter) AddValues(kvList []interface{}) { | ||||
| func (f *Formatter) AddValues(kvList []any) { | ||||
| 	// Three slice args forces a copy. | ||||
| 	n := len(f.values) | ||||
| 	f.values = append(f.values[:n:n], kvList...) | ||||
|  |  | |||
							
								
								
									
										35
									
								
								vendor/github.com/go-logr/logr/logr.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/go-logr/logr/logr.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -127,9 +127,9 @@ limitations under the License. | |||
| // such a value can call its methods without having to check whether the | ||||
| // instance is ready for use. | ||||
| // | ||||
| // Calling methods with the null logger (Logger{}) as instance will crash | ||||
| // because it has no LogSink. Therefore this null logger should never be passed | ||||
| // around. For cases where passing a logger is optional, a pointer to Logger | ||||
| // The zero logger (= Logger{}) is identical to Discard() and discards all log | ||||
| // entries. Code that receives a Logger by value can simply call it, the methods | ||||
| // will never crash. For cases where passing a logger is optional, a pointer to Logger | ||||
| // should be used. | ||||
| // | ||||
| // # Key Naming Conventions | ||||
|  | @ -258,6 +258,12 @@ type Logger struct { | |||
| // Enabled tests whether this Logger is enabled.  For example, commandline | ||||
| // flags might be used to set the logging verbosity and disable some info logs. | ||||
| func (l Logger) Enabled() bool { | ||||
| 	// Some implementations of LogSink look at the caller in Enabled (e.g. | ||||
| 	// different verbosity levels per package or file), but we only pass one | ||||
| 	// CallDepth in (via Init).  This means that all calls from Logger to the | ||||
| 	// LogSink's Enabled, Info, and Error methods must have the same number of | ||||
| 	// frames.  In other words, Logger methods can't call other Logger methods | ||||
| 	// which call these LogSink methods unless we do it the same in all paths. | ||||
| 	return l.sink != nil && l.sink.Enabled(l.level) | ||||
| } | ||||
| 
 | ||||
|  | @ -267,11 +273,11 @@ func (l Logger) Enabled() bool { | |||
| // line.  The key/value pairs can then be used to add additional variable | ||||
| // information.  The key/value pairs must alternate string keys and arbitrary | ||||
| // values. | ||||
| func (l Logger) Info(msg string, keysAndValues ...interface{}) { | ||||
| func (l Logger) Info(msg string, keysAndValues ...any) { | ||||
| 	if l.sink == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	if l.Enabled() { | ||||
| 	if l.sink.Enabled(l.level) { // see comment in Enabled | ||||
| 		if withHelper, ok := l.sink.(CallStackHelperLogSink); ok { | ||||
| 			withHelper.GetCallStackHelper()() | ||||
| 		} | ||||
|  | @ -289,7 +295,7 @@ func (l Logger) Info(msg string, keysAndValues ...interface{}) { | |||
| // while the err argument should be used to attach the actual error that | ||||
| // triggered this log line, if present. The err parameter is optional | ||||
| // and nil may be passed instead of an error instance. | ||||
| func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) { | ||||
| func (l Logger) Error(err error, msg string, keysAndValues ...any) { | ||||
| 	if l.sink == nil { | ||||
| 		return | ||||
| 	} | ||||
|  | @ -314,9 +320,16 @@ func (l Logger) V(level int) Logger { | |||
| 	return l | ||||
| } | ||||
| 
 | ||||
| // GetV returns the verbosity level of the logger. If the logger's LogSink is | ||||
| // nil as in the Discard logger, this will always return 0. | ||||
| func (l Logger) GetV() int { | ||||
| 	// 0 if l.sink nil because of the if check in V above. | ||||
| 	return l.level | ||||
| } | ||||
| 
 | ||||
| // WithValues returns a new Logger instance with additional key/value pairs. | ||||
| // See Info for documentation on how key/value pairs work. | ||||
| func (l Logger) WithValues(keysAndValues ...interface{}) Logger { | ||||
| func (l Logger) WithValues(keysAndValues ...any) Logger { | ||||
| 	if l.sink == nil { | ||||
| 		return l | ||||
| 	} | ||||
|  | @ -467,15 +480,15 @@ type LogSink interface { | |||
| 	// The level argument is provided for optional logging.  This method will | ||||
| 	// only be called when Enabled(level) is true. See Logger.Info for more | ||||
| 	// details. | ||||
| 	Info(level int, msg string, keysAndValues ...interface{}) | ||||
| 	Info(level int, msg string, keysAndValues ...any) | ||||
| 
 | ||||
| 	// Error logs an error, with the given message and key/value pairs as | ||||
| 	// context.  See Logger.Error for more details. | ||||
| 	Error(err error, msg string, keysAndValues ...interface{}) | ||||
| 	Error(err error, msg string, keysAndValues ...any) | ||||
| 
 | ||||
| 	// WithValues returns a new LogSink with additional key/value pairs.  See | ||||
| 	// Logger.WithValues for more details. | ||||
| 	WithValues(keysAndValues ...interface{}) LogSink | ||||
| 	WithValues(keysAndValues ...any) LogSink | ||||
| 
 | ||||
| 	// WithName returns a new LogSink with the specified name appended.  See | ||||
| 	// Logger.WithName for more details. | ||||
|  | @ -546,5 +559,5 @@ type Marshaler interface { | |||
| 	//     with exported fields | ||||
| 	// | ||||
| 	// It may return any value of any type. | ||||
| 	MarshalLog() interface{} | ||||
| 	MarshalLog() any | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue