rebase: bump k8s.io/klog/v2 from 2.90.0 to 2.100.1

Bumps [k8s.io/klog/v2](https://github.com/kubernetes/klog) from 2.90.0 to 2.100.1.
- [Release notes](https://github.com/kubernetes/klog/releases)
- [Changelog](https://github.com/kubernetes/klog/blob/main/RELEASE.md)
- [Commits](https://github.com/kubernetes/klog/compare/v2.90.0...v2.100.1)

---
updated-dependencies:
- dependency-name: k8s.io/klog/v2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
dependabot[bot] 2023-05-15 21:01:54 +00:00 committed by mergify[bot]
parent 7740cd5c36
commit f4f6b7ae60
9 changed files with 268 additions and 79 deletions

2
go.mod
View File

@ -39,7 +39,7 @@ require (
k8s.io/apimachinery v0.26.3 k8s.io/apimachinery v0.26.3
k8s.io/client-go v12.0.0+incompatible k8s.io/client-go v12.0.0+incompatible
k8s.io/cloud-provider v0.26.2 k8s.io/cloud-provider v0.26.2
k8s.io/klog/v2 v2.90.0 k8s.io/klog/v2 v2.100.1
k8s.io/kubernetes v1.26.2 k8s.io/kubernetes v1.26.2
k8s.io/mount-utils v0.26.2 k8s.io/mount-utils v0.26.2
k8s.io/pod-security-admission v0.0.0 k8s.io/pod-security-admission v0.0.0

4
go.sum
View File

@ -1798,8 +1798,8 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/klog/v2 v2.90.0 h1:VkTxIV/FjRXn1fgNNcKGM8cfmL1Z33ZjXRTVxKCoF5M= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg=
k8s.io/klog/v2 v2.90.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/kms v0.26.2/go.mod h1:69qGnf1NsFOQP07fBYqNLZklqEHSJF024JqYCaeVxHg= k8s.io/kms v0.26.2/go.mod h1:69qGnf1NsFOQP07fBYqNLZklqEHSJF024JqYCaeVxHg=
k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E=

30
vendor/k8s.io/klog/v2/contextual.go generated vendored
View File

@ -70,11 +70,14 @@ func SetLogger(logger logr.Logger) {
// routing log entries through klogr into klog and then into the actual Logger // routing log entries through klogr into klog and then into the actual Logger
// backend. // backend.
func SetLoggerWithOptions(logger logr.Logger, opts ...LoggerOption) { func SetLoggerWithOptions(logger logr.Logger, opts ...LoggerOption) {
logging.logger = &logger
logging.loggerOptions = loggerOptions{} logging.loggerOptions = loggerOptions{}
for _, opt := range opts { for _, opt := range opts {
opt(&logging.loggerOptions) opt(&logging.loggerOptions)
} }
logging.logger = &logWriter{
Logger: logger,
writeKlogBuffer: logging.loggerOptions.writeKlogBuffer,
}
} }
// ContextualLogger determines whether the logger passed to // ContextualLogger determines whether the logger passed to
@ -93,6 +96,22 @@ func FlushLogger(flush func()) LoggerOption {
} }
} }
// WriteKlogBuffer sets a callback that will be invoked by klog to write output
// produced by non-structured log calls like Infof.
//
// The buffer will contain exactly the same data that klog normally would write
// into its own output stream(s). In particular this includes the header, if
// klog is configured to write one. The callback then can divert that data into
// its own output streams. The buffer may or may not end in a line break.
//
// Without such a callback, klog will call the logger's Info or Error method
// with just the message string (i.e. no header).
func WriteKlogBuffer(write func([]byte)) LoggerOption {
return func(o *loggerOptions) {
o.writeKlogBuffer = write
}
}
// LoggerOption implements the functional parameter paradigm for // LoggerOption implements the functional parameter paradigm for
// SetLoggerWithOptions. // SetLoggerWithOptions.
type LoggerOption func(o *loggerOptions) type LoggerOption func(o *loggerOptions)
@ -100,6 +119,13 @@ type LoggerOption func(o *loggerOptions)
type loggerOptions struct { type loggerOptions struct {
contextualLogger bool contextualLogger bool
flush func() flush func()
writeKlogBuffer func([]byte)
}
// logWriter combines a logger (always set) with a write callback (optional).
type logWriter struct {
Logger
writeKlogBuffer func([]byte)
} }
// ClearLogger removes a backing Logger implementation if one was set earlier // ClearLogger removes a backing Logger implementation if one was set earlier
@ -152,7 +178,7 @@ func Background() Logger {
if logging.loggerOptions.contextualLogger { if logging.loggerOptions.contextualLogger {
// Is non-nil because logging.loggerOptions.contextualLogger is // Is non-nil because logging.loggerOptions.contextualLogger is
// only true if a logger was set. // only true if a logger was set.
return *logging.logger return logging.logger.Logger
} }
return klogLogger return klogLogger

65
vendor/k8s.io/klog/v2/format.go generated vendored Normal file
View File

@ -0,0 +1,65 @@
/*
Copyright 2023 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package klog
import (
"encoding/json"
"fmt"
"strings"
"github.com/go-logr/logr"
)
// Format wraps a value of an arbitrary type and implement fmt.Stringer and
// logr.Marshaler for them. Stringer returns pretty-printed JSON. MarshalLog
// returns the original value with a type that has no special methods, in
// particular no MarshalLog or MarshalJSON.
//
// Wrapping values like that is useful when the value has a broken
// implementation of these special functions (for example, a type which
// inherits String from TypeMeta, but then doesn't re-implement String) or the
// implementation produces output that is less readable or unstructured (for
// example, the generated String functions for Kubernetes API types).
func Format(obj interface{}) interface{} {
return formatAny{Object: obj}
}
type formatAny struct {
Object interface{}
}
func (f formatAny) String() string {
var buffer strings.Builder
encoder := json.NewEncoder(&buffer)
encoder.SetIndent("", " ")
if err := encoder.Encode(&f.Object); err != nil {
return fmt.Sprintf("error marshaling %T to JSON: %v", f, err)
}
return buffer.String()
}
func (f formatAny) MarshalLog() interface{} {
// Returning a pointer to a pointer ensures that zapr doesn't find a
// fmt.Stringer or logr.Marshaler when it checks the type of the
// value. It then falls back to reflection, which dumps the value being
// pointed to (JSON doesn't have pointers).
ptr := &f.Object
return &ptr
}
var _ fmt.Stringer = formatAny{}
var _ logr.Marshaler = formatAny{}

View File

@ -55,6 +55,17 @@ func GetBuffer() *Buffer {
// PutBuffer returns a buffer to the free list. // PutBuffer returns a buffer to the free list.
func PutBuffer(b *Buffer) { func PutBuffer(b *Buffer) {
if b.Len() >= 256 {
// Let big buffers die a natural death, without relying on
// sync.Pool behavior. The documentation implies that items may
// get deallocated while stored there ("If the Pool holds the
// only reference when this [= be removed automatically]
// happens, the item might be deallocated."), but
// https://github.com/golang/go/issues/23199 leans more towards
// having such a size limit.
return
}
buffers.Put(b) buffers.Put(b)
} }
@ -99,7 +110,8 @@ func (buf *Buffer) someDigits(i, d int) int {
return copy(buf.Tmp[i:], buf.Tmp[j:]) return copy(buf.Tmp[i:], buf.Tmp[j:])
} }
// FormatHeader formats a log header using the provided file name and line number. // FormatHeader formats a log header using the provided file name and line number
// and writes it into the buffer.
func (buf *Buffer) FormatHeader(s severity.Severity, file string, line int, now time.Time) { func (buf *Buffer) FormatHeader(s severity.Severity, file string, line int, now time.Time) {
if line < 0 { if line < 0 {
line = 0 // not a real line number, but acceptable to someDigits line = 0 // not a real line number, but acceptable to someDigits
@ -135,3 +147,30 @@ func (buf *Buffer) FormatHeader(s severity.Severity, file string, line int, now
buf.Tmp[n+2] = ' ' buf.Tmp[n+2] = ' '
buf.Write(buf.Tmp[:n+3]) buf.Write(buf.Tmp[:n+3])
} }
// SprintHeader formats a log header and returns a string. This is a simpler
// version of FormatHeader for use in ktesting.
func (buf *Buffer) SprintHeader(s severity.Severity, now time.Time) string {
if s > severity.FatalLog {
s = severity.InfoLog // for safety.
}
// Avoid Fprintf, for speed. The format is so simple that we can do it quickly by hand.
// It's worth about 3X. Fprintf is hard.
_, month, day := now.Date()
hour, minute, second := now.Clock()
// Lmmdd hh:mm:ss.uuuuuu threadid file:line]
buf.Tmp[0] = severity.Char[s]
buf.twoDigits(1, int(month))
buf.twoDigits(3, day)
buf.Tmp[5] = ' '
buf.twoDigits(6, hour)
buf.Tmp[8] = ':'
buf.twoDigits(9, minute)
buf.Tmp[11] = ':'
buf.twoDigits(12, second)
buf.Tmp[14] = '.'
buf.nDigits(6, 15, now.Nanosecond()/1000, '0')
buf.Tmp[21] = ']'
return string(buf.Tmp[:22])
}

View File

@ -18,6 +18,7 @@ package serialize
import ( import (
"bytes" "bytes"
"encoding/json"
"fmt" "fmt"
"strconv" "strconv"
@ -95,9 +96,15 @@ func MergeKVs(first, second []interface{}) []interface{} {
return merged return merged
} }
type Formatter struct {
AnyToStringHook AnyToStringFunc
}
type AnyToStringFunc func(v interface{}) string
// MergeKVsInto is a variant of MergeKVs which directly formats the key/value // MergeKVsInto is a variant of MergeKVs which directly formats the key/value
// pairs into a buffer. // pairs into a buffer.
func MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) { func (f Formatter) MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) {
if len(first) == 0 && len(second) == 0 { if len(first) == 0 && len(second) == 0 {
// Nothing to do at all. // Nothing to do at all.
return return
@ -107,7 +114,7 @@ func MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) {
// Nothing to be overridden, second slice is well-formed // Nothing to be overridden, second slice is well-formed
// and can be used directly. // and can be used directly.
for i := 0; i < len(second); i += 2 { for i := 0; i < len(second); i += 2 {
KVFormat(b, second[i], second[i+1]) f.KVFormat(b, second[i], second[i+1])
} }
return return
} }
@ -127,24 +134,28 @@ func MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) {
if overrides[key] { if overrides[key] {
continue continue
} }
KVFormat(b, key, first[i+1]) f.KVFormat(b, key, first[i+1])
} }
// Round down. // Round down.
l := len(second) l := len(second)
l = l / 2 * 2 l = l / 2 * 2
for i := 1; i < l; i += 2 { for i := 1; i < l; i += 2 {
KVFormat(b, second[i-1], second[i]) f.KVFormat(b, second[i-1], second[i])
} }
if len(second)%2 == 1 { if len(second)%2 == 1 {
KVFormat(b, second[len(second)-1], missingValue) f.KVFormat(b, second[len(second)-1], missingValue)
} }
} }
func MergeAndFormatKVs(b *bytes.Buffer, first, second []interface{}) {
Formatter{}.MergeAndFormatKVs(b, first, second)
}
const missingValue = "(MISSING)" const missingValue = "(MISSING)"
// KVListFormat serializes all key/value pairs into the provided buffer. // KVListFormat serializes all key/value pairs into the provided buffer.
// A space gets inserted before the first pair and between each pair. // A space gets inserted before the first pair and between each pair.
func KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) { func (f Formatter) KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) {
for i := 0; i < len(keysAndValues); i += 2 { for i := 0; i < len(keysAndValues); i += 2 {
var v interface{} var v interface{}
k := keysAndValues[i] k := keysAndValues[i]
@ -153,13 +164,17 @@ func KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) {
} else { } else {
v = missingValue v = missingValue
} }
KVFormat(b, k, v) f.KVFormat(b, k, v)
} }
} }
func KVListFormat(b *bytes.Buffer, keysAndValues ...interface{}) {
Formatter{}.KVListFormat(b, keysAndValues...)
}
// KVFormat serializes one key/value pair into the provided buffer. // KVFormat serializes one key/value pair into the provided buffer.
// A space gets inserted before the pair. // A space gets inserted before the pair.
func KVFormat(b *bytes.Buffer, k, v interface{}) { func (f Formatter) KVFormat(b *bytes.Buffer, k, v interface{}) {
b.WriteByte(' ') b.WriteByte(' ')
// Keys are assumed to be well-formed according to // Keys are assumed to be well-formed according to
// https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/migration-to-structured-logging.md#name-arguments // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/migration-to-structured-logging.md#name-arguments
@ -182,11 +197,11 @@ func KVFormat(b *bytes.Buffer, k, v interface{}) {
case textWriter: case textWriter:
writeTextWriterValue(b, v) writeTextWriterValue(b, v)
case fmt.Stringer: case fmt.Stringer:
writeStringValue(b, true, StringerToString(v)) writeStringValue(b, StringerToString(v))
case string: case string:
writeStringValue(b, true, v) writeStringValue(b, v)
case error: case error:
writeStringValue(b, true, ErrorToString(v)) writeStringValue(b, ErrorToString(v))
case logr.Marshaler: case logr.Marshaler:
value := MarshalerToValue(v) value := MarshalerToValue(v)
// A marshaler that returns a string is useful for // A marshaler that returns a string is useful for
@ -201,9 +216,9 @@ func KVFormat(b *bytes.Buffer, k, v interface{}) {
// value directly. // value directly.
switch value := value.(type) { switch value := value.(type) {
case string: case string:
writeStringValue(b, true, value) writeStringValue(b, value)
default: default:
writeStringValue(b, false, fmt.Sprintf("%+v", value)) f.formatAny(b, value)
} }
case []byte: case []byte:
// In https://github.com/kubernetes/klog/pull/237 it was decided // In https://github.com/kubernetes/klog/pull/237 it was decided
@ -220,10 +235,35 @@ func KVFormat(b *bytes.Buffer, k, v interface{}) {
b.WriteByte('=') b.WriteByte('=')
b.WriteString(fmt.Sprintf("%+q", v)) b.WriteString(fmt.Sprintf("%+q", v))
default: default:
writeStringValue(b, false, fmt.Sprintf("%+v", v)) f.formatAny(b, v)
} }
} }
func KVFormat(b *bytes.Buffer, k, v interface{}) {
Formatter{}.KVFormat(b, k, v)
}
// formatAny is the fallback formatter for a value. It supports a hook (for
// example, for YAML encoding) and itself uses JSON encoding.
func (f Formatter) formatAny(b *bytes.Buffer, v interface{}) {
b.WriteRune('=')
if f.AnyToStringHook != nil {
b.WriteString(f.AnyToStringHook(v))
return
}
encoder := json.NewEncoder(b)
l := b.Len()
if err := encoder.Encode(v); err != nil {
// This shouldn't happen. We discard whatever the encoder
// wrote and instead dump an error string.
b.Truncate(l)
b.WriteString(fmt.Sprintf(`"<internal error: %v>"`, err))
return
}
// Remove trailing newline.
b.Truncate(b.Len() - 1)
}
// StringerToString converts a Stringer to a string, // StringerToString converts a Stringer to a string,
// handling panics if they occur. // handling panics if they occur.
func StringerToString(s fmt.Stringer) (ret string) { func StringerToString(s fmt.Stringer) (ret string) {
@ -261,7 +301,7 @@ func ErrorToString(err error) (ret string) {
} }
func writeTextWriterValue(b *bytes.Buffer, v textWriter) { func writeTextWriterValue(b *bytes.Buffer, v textWriter) {
b.WriteRune('=') b.WriteByte('=')
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
fmt.Fprintf(b, `"<panic: %s>"`, err) fmt.Fprintf(b, `"<panic: %s>"`, err)
@ -270,18 +310,13 @@ func writeTextWriterValue(b *bytes.Buffer, v textWriter) {
v.WriteText(b) v.WriteText(b)
} }
func writeStringValue(b *bytes.Buffer, quote bool, v string) { func writeStringValue(b *bytes.Buffer, v string) {
data := []byte(v) data := []byte(v)
index := bytes.IndexByte(data, '\n') index := bytes.IndexByte(data, '\n')
if index == -1 { if index == -1 {
b.WriteByte('=') b.WriteByte('=')
if quote { // Simple string, quote quotation marks and non-printable characters.
// Simple string, quote quotation marks and non-printable characters. b.WriteString(strconv.Quote(v))
b.WriteString(strconv.Quote(v))
return
}
// Non-string with no line breaks.
b.WriteString(v)
return return
} }

View File

@ -178,14 +178,14 @@ func (ks kobjSlice) process() (objs []interface{}, err string) {
return objectRefs, "" return objectRefs, ""
} }
var nilToken = []byte("<nil>") var nilToken = []byte("null")
func (ks kobjSlice) WriteText(out *bytes.Buffer) { func (ks kobjSlice) WriteText(out *bytes.Buffer) {
s := reflect.ValueOf(ks.arg) s := reflect.ValueOf(ks.arg)
switch s.Kind() { switch s.Kind() {
case reflect.Invalid: case reflect.Invalid:
// nil parameter, print as empty slice. // nil parameter, print as null.
out.WriteString("[]") out.Write(nilToken)
return return
case reflect.Slice: case reflect.Slice:
// Okay, handle below. // Okay, handle below.
@ -197,15 +197,15 @@ func (ks kobjSlice) WriteText(out *bytes.Buffer) {
defer out.Write([]byte{']'}) defer out.Write([]byte{']'})
for i := 0; i < s.Len(); i++ { for i := 0; i < s.Len(); i++ {
if i > 0 { if i > 0 {
out.Write([]byte{' '}) out.Write([]byte{','})
} }
item := s.Index(i).Interface() item := s.Index(i).Interface()
if item == nil { if item == nil {
out.Write(nilToken) out.Write(nilToken)
} else if v, ok := item.(KMetadata); ok { } else if v, ok := item.(KMetadata); ok {
KObj(v).writeUnquoted(out) KObj(v).WriteText(out)
} else { } else {
fmt.Fprintf(out, "<KObjSlice needs a slice of values implementing KMetadata, got type %T>", item) fmt.Fprintf(out, `"<KObjSlice needs a slice of values implementing KMetadata, got type %T>"`, item)
return return
} }
} }

110
vendor/k8s.io/klog/v2/klog.go generated vendored
View File

@ -91,8 +91,6 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/go-logr/logr"
"k8s.io/klog/v2/internal/buffer" "k8s.io/klog/v2/internal/buffer"
"k8s.io/klog/v2/internal/clock" "k8s.io/klog/v2/internal/clock"
"k8s.io/klog/v2/internal/dbg" "k8s.io/klog/v2/internal/dbg"
@ -453,7 +451,7 @@ type settings struct {
// logger is the global Logger chosen by users of klog, nil if // logger is the global Logger chosen by users of klog, nil if
// none is available. // none is available.
logger *Logger logger *logWriter
// loggerOptions contains the options that were supplied for // loggerOptions contains the options that were supplied for
// globalLogger. // globalLogger.
@ -525,6 +523,11 @@ func (s settings) deepCopy() settings {
} }
s.vmodule.filter = filter s.vmodule.filter = filter
if s.logger != nil {
logger := *s.logger
s.logger = &logger
}
return s return s
} }
@ -668,15 +671,16 @@ func (l *loggingT) formatHeader(s severity.Severity, file string, line int) *buf
return buf return buf
} }
func (l *loggingT) println(s severity.Severity, logger *logr.Logger, filter LogFilter, args ...interface{}) { func (l *loggingT) println(s severity.Severity, logger *logWriter, filter LogFilter, args ...interface{}) {
l.printlnDepth(s, logger, filter, 1, args...) l.printlnDepth(s, logger, filter, 1, args...)
} }
func (l *loggingT) printlnDepth(s severity.Severity, logger *logr.Logger, filter LogFilter, depth int, args ...interface{}) { func (l *loggingT) printlnDepth(s severity.Severity, logger *logWriter, filter LogFilter, depth int, args ...interface{}) {
buf, file, line := l.header(s, depth) buf, file, line := l.header(s, depth)
// if logger is set, we clear the generated header as we rely on the backing // If a logger is set and doesn't support writing a formatted buffer,
// logger implementation to print headers // we clear the generated header as we rely on the backing
if logger != nil { // logger implementation to print headers.
if logger != nil && logger.writeKlogBuffer == nil {
buffer.PutBuffer(buf) buffer.PutBuffer(buf)
buf = buffer.GetBuffer() buf = buffer.GetBuffer()
} }
@ -687,15 +691,16 @@ func (l *loggingT) printlnDepth(s severity.Severity, logger *logr.Logger, filter
l.output(s, logger, buf, depth, file, line, false) l.output(s, logger, buf, depth, file, line, false)
} }
func (l *loggingT) print(s severity.Severity, logger *logr.Logger, filter LogFilter, args ...interface{}) { func (l *loggingT) print(s severity.Severity, logger *logWriter, filter LogFilter, args ...interface{}) {
l.printDepth(s, logger, filter, 1, args...) l.printDepth(s, logger, filter, 1, args...)
} }
func (l *loggingT) printDepth(s severity.Severity, logger *logr.Logger, filter LogFilter, depth int, args ...interface{}) { func (l *loggingT) printDepth(s severity.Severity, logger *logWriter, filter LogFilter, depth int, args ...interface{}) {
buf, file, line := l.header(s, depth) buf, file, line := l.header(s, depth)
// if logr is set, we clear the generated header as we rely on the backing // If a logger is set and doesn't support writing a formatted buffer,
// logr implementation to print headers // we clear the generated header as we rely on the backing
if logger != nil { // logger implementation to print headers.
if logger != nil && logger.writeKlogBuffer == nil {
buffer.PutBuffer(buf) buffer.PutBuffer(buf)
buf = buffer.GetBuffer() buf = buffer.GetBuffer()
} }
@ -709,15 +714,16 @@ func (l *loggingT) printDepth(s severity.Severity, logger *logr.Logger, filter L
l.output(s, logger, buf, depth, file, line, false) l.output(s, logger, buf, depth, file, line, false)
} }
func (l *loggingT) printf(s severity.Severity, logger *logr.Logger, filter LogFilter, format string, args ...interface{}) { func (l *loggingT) printf(s severity.Severity, logger *logWriter, filter LogFilter, format string, args ...interface{}) {
l.printfDepth(s, logger, filter, 1, format, args...) l.printfDepth(s, logger, filter, 1, format, args...)
} }
func (l *loggingT) printfDepth(s severity.Severity, logger *logr.Logger, filter LogFilter, depth int, format string, args ...interface{}) { func (l *loggingT) printfDepth(s severity.Severity, logger *logWriter, filter LogFilter, depth int, format string, args ...interface{}) {
buf, file, line := l.header(s, depth) buf, file, line := l.header(s, depth)
// if logr is set, we clear the generated header as we rely on the backing // If a logger is set and doesn't support writing a formatted buffer,
// logr implementation to print headers // we clear the generated header as we rely on the backing
if logger != nil { // logger implementation to print headers.
if logger != nil && logger.writeKlogBuffer == nil {
buffer.PutBuffer(buf) buffer.PutBuffer(buf)
buf = buffer.GetBuffer() buf = buffer.GetBuffer()
} }
@ -734,11 +740,12 @@ func (l *loggingT) printfDepth(s severity.Severity, logger *logr.Logger, filter
// printWithFileLine behaves like print but uses the provided file and line number. If // printWithFileLine behaves like print but uses the provided file and line number. If
// alsoLogToStderr is true, the log message always appears on standard error; it // alsoLogToStderr is true, the log message always appears on standard error; it
// will also appear in the log file unless --logtostderr is set. // will also appear in the log file unless --logtostderr is set.
func (l *loggingT) printWithFileLine(s severity.Severity, logger *logr.Logger, filter LogFilter, file string, line int, alsoToStderr bool, args ...interface{}) { func (l *loggingT) printWithFileLine(s severity.Severity, logger *logWriter, filter LogFilter, file string, line int, alsoToStderr bool, args ...interface{}) {
buf := l.formatHeader(s, file, line) buf := l.formatHeader(s, file, line)
// if logr is set, we clear the generated header as we rely on the backing // If a logger is set and doesn't support writing a formatted buffer,
// logr implementation to print headers // we clear the generated header as we rely on the backing
if logger != nil { // logger implementation to print headers.
if logger != nil && logger.writeKlogBuffer == nil {
buffer.PutBuffer(buf) buffer.PutBuffer(buf)
buf = buffer.GetBuffer() buf = buffer.GetBuffer()
} }
@ -753,7 +760,7 @@ func (l *loggingT) printWithFileLine(s severity.Severity, logger *logr.Logger, f
} }
// if loggr is specified, will call loggr.Error, otherwise output with logging module. // if loggr is specified, will call loggr.Error, otherwise output with logging module.
func (l *loggingT) errorS(err error, logger *logr.Logger, filter LogFilter, depth int, msg string, keysAndValues ...interface{}) { func (l *loggingT) errorS(err error, logger *logWriter, filter LogFilter, depth int, msg string, keysAndValues ...interface{}) {
if filter != nil { if filter != nil {
msg, keysAndValues = filter.FilterS(msg, keysAndValues) msg, keysAndValues = filter.FilterS(msg, keysAndValues)
} }
@ -765,7 +772,7 @@ func (l *loggingT) errorS(err error, logger *logr.Logger, filter LogFilter, dept
} }
// if loggr is specified, will call loggr.Info, otherwise output with logging module. // if loggr is specified, will call loggr.Info, otherwise output with logging module.
func (l *loggingT) infoS(logger *logr.Logger, filter LogFilter, depth int, msg string, keysAndValues ...interface{}) { func (l *loggingT) infoS(logger *logWriter, filter LogFilter, depth int, msg string, keysAndValues ...interface{}) {
if filter != nil { if filter != nil {
msg, keysAndValues = filter.FilterS(msg, keysAndValues) msg, keysAndValues = filter.FilterS(msg, keysAndValues)
} }
@ -846,7 +853,7 @@ func LogToStderr(stderr bool) {
} }
// output writes the data to the log files and releases the buffer. // output writes the data to the log files and releases the buffer.
func (l *loggingT) output(s severity.Severity, log *logr.Logger, buf *buffer.Buffer, depth int, file string, line int, alsoToStderr bool) { func (l *loggingT) output(s severity.Severity, logger *logWriter, buf *buffer.Buffer, depth int, file string, line int, alsoToStderr bool) {
var isLocked = true var isLocked = true
l.mu.Lock() l.mu.Lock()
defer func() { defer func() {
@ -862,13 +869,17 @@ func (l *loggingT) output(s severity.Severity, log *logr.Logger, buf *buffer.Buf
} }
} }
data := buf.Bytes() data := buf.Bytes()
if log != nil { if logger != nil {
// TODO: set 'severity' and caller information as structured log info if logger.writeKlogBuffer != nil {
// keysAndValues := []interface{}{"severity", severityName[s], "file", file, "line", line} logger.writeKlogBuffer(data)
if s == severity.ErrorLog {
logging.logger.WithCallDepth(depth+3).Error(nil, string(data))
} else { } else {
log.WithCallDepth(depth + 3).Info(string(data)) // TODO: set 'severity' and caller information as structured log info
// keysAndValues := []interface{}{"severity", severityName[s], "file", file, "line", line}
if s == severity.ErrorLog {
logger.WithCallDepth(depth+3).Error(nil, string(data))
} else {
logger.WithCallDepth(depth + 3).Info(string(data))
}
} }
} else if l.toStderr { } else if l.toStderr {
os.Stderr.Write(data) os.Stderr.Write(data)
@ -1217,6 +1228,19 @@ func CopyStandardLogTo(name string) {
stdLog.SetOutput(logBridge(sev)) stdLog.SetOutput(logBridge(sev))
} }
// NewStandardLogger returns a Logger that writes to the klog logs for the
// named and lower severities.
//
// Valid names are "INFO", "WARNING", "ERROR", and "FATAL". If the name is not
// recognized, NewStandardLogger panics.
func NewStandardLogger(name string) *stdLog.Logger {
sev, ok := severity.ByName(name)
if !ok {
panic(fmt.Sprintf("klog.NewStandardLogger(%q): unknown severity", name))
}
return stdLog.New(logBridge(sev), "", stdLog.Lshortfile)
}
// logBridge provides the Write method that enables CopyStandardLogTo to connect // logBridge provides the Write method that enables CopyStandardLogTo to connect
// Go's standard logs to the logs provided by this package. // Go's standard logs to the logs provided by this package.
type logBridge severity.Severity type logBridge severity.Severity
@ -1277,7 +1301,7 @@ func (l *loggingT) setV(pc uintptr) Level {
// See the documentation of V for more information. // See the documentation of V for more information.
type Verbose struct { type Verbose struct {
enabled bool enabled bool
logr *logr.Logger logger *logWriter
} }
func newVerbose(level Level, b bool) Verbose { func newVerbose(level Level, b bool) Verbose {
@ -1285,7 +1309,7 @@ func newVerbose(level Level, b bool) Verbose {
return Verbose{b, nil} return Verbose{b, nil}
} }
v := logging.logger.V(int(level)) v := logging.logger.V(int(level))
return Verbose{b, &v} return Verbose{b, &logWriter{Logger: v, writeKlogBuffer: logging.loggerOptions.writeKlogBuffer}}
} }
// V reports whether verbosity at the call site is at least the requested level. // V reports whether verbosity at the call site is at least the requested level.
@ -1359,7 +1383,7 @@ func (v Verbose) Enabled() bool {
// See the documentation of V for usage. // See the documentation of V for usage.
func (v Verbose) Info(args ...interface{}) { func (v Verbose) Info(args ...interface{}) {
if v.enabled { if v.enabled {
logging.print(severity.InfoLog, v.logr, logging.filter, args...) logging.print(severity.InfoLog, v.logger, logging.filter, args...)
} }
} }
@ -1367,7 +1391,7 @@ func (v Verbose) Info(args ...interface{}) {
// See the documentation of V for usage. // See the documentation of V for usage.
func (v Verbose) InfoDepth(depth int, args ...interface{}) { func (v Verbose) InfoDepth(depth int, args ...interface{}) {
if v.enabled { if v.enabled {
logging.printDepth(severity.InfoLog, v.logr, logging.filter, depth, args...) logging.printDepth(severity.InfoLog, v.logger, logging.filter, depth, args...)
} }
} }
@ -1375,7 +1399,7 @@ func (v Verbose) InfoDepth(depth int, args ...interface{}) {
// See the documentation of V for usage. // See the documentation of V for usage.
func (v Verbose) Infoln(args ...interface{}) { func (v Verbose) Infoln(args ...interface{}) {
if v.enabled { if v.enabled {
logging.println(severity.InfoLog, v.logr, logging.filter, args...) logging.println(severity.InfoLog, v.logger, logging.filter, args...)
} }
} }
@ -1383,7 +1407,7 @@ func (v Verbose) Infoln(args ...interface{}) {
// See the documentation of V for usage. // See the documentation of V for usage.
func (v Verbose) InfolnDepth(depth int, args ...interface{}) { func (v Verbose) InfolnDepth(depth int, args ...interface{}) {
if v.enabled { if v.enabled {
logging.printlnDepth(severity.InfoLog, v.logr, logging.filter, depth, args...) logging.printlnDepth(severity.InfoLog, v.logger, logging.filter, depth, args...)
} }
} }
@ -1391,7 +1415,7 @@ func (v Verbose) InfolnDepth(depth int, args ...interface{}) {
// See the documentation of V for usage. // See the documentation of V for usage.
func (v Verbose) Infof(format string, args ...interface{}) { func (v Verbose) Infof(format string, args ...interface{}) {
if v.enabled { if v.enabled {
logging.printf(severity.InfoLog, v.logr, logging.filter, format, args...) logging.printf(severity.InfoLog, v.logger, logging.filter, format, args...)
} }
} }
@ -1399,7 +1423,7 @@ func (v Verbose) Infof(format string, args ...interface{}) {
// See the documentation of V for usage. // See the documentation of V for usage.
func (v Verbose) InfofDepth(depth int, format string, args ...interface{}) { func (v Verbose) InfofDepth(depth int, format string, args ...interface{}) {
if v.enabled { if v.enabled {
logging.printfDepth(severity.InfoLog, v.logr, logging.filter, depth, format, args...) logging.printfDepth(severity.InfoLog, v.logger, logging.filter, depth, format, args...)
} }
} }
@ -1407,7 +1431,7 @@ func (v Verbose) InfofDepth(depth int, format string, args ...interface{}) {
// See the documentation of V for usage. // See the documentation of V for usage.
func (v Verbose) InfoS(msg string, keysAndValues ...interface{}) { func (v Verbose) InfoS(msg string, keysAndValues ...interface{}) {
if v.enabled { if v.enabled {
logging.infoS(v.logr, logging.filter, 0, msg, keysAndValues...) logging.infoS(v.logger, logging.filter, 0, msg, keysAndValues...)
} }
} }
@ -1421,14 +1445,14 @@ func InfoSDepth(depth int, msg string, keysAndValues ...interface{}) {
// See the documentation of V for usage. // See the documentation of V for usage.
func (v Verbose) InfoSDepth(depth int, msg string, keysAndValues ...interface{}) { func (v Verbose) InfoSDepth(depth int, msg string, keysAndValues ...interface{}) {
if v.enabled { if v.enabled {
logging.infoS(v.logr, logging.filter, depth, msg, keysAndValues...) logging.infoS(v.logger, logging.filter, depth, msg, keysAndValues...)
} }
} }
// Deprecated: Use ErrorS instead. // Deprecated: Use ErrorS instead.
func (v Verbose) Error(err error, msg string, args ...interface{}) { func (v Verbose) Error(err error, msg string, args ...interface{}) {
if v.enabled { if v.enabled {
logging.errorS(err, v.logr, logging.filter, 0, msg, args...) logging.errorS(err, v.logger, logging.filter, 0, msg, args...)
} }
} }
@ -1436,7 +1460,7 @@ func (v Verbose) Error(err error, msg string, args ...interface{}) {
// See the documentation of V for usage. // See the documentation of V for usage.
func (v Verbose) ErrorS(err error, msg string, keysAndValues ...interface{}) { func (v Verbose) ErrorS(err error, msg string, keysAndValues ...interface{}) {
if v.enabled { if v.enabled {
logging.errorS(err, v.logr, logging.filter, 0, msg, keysAndValues...) logging.errorS(err, v.logger, logging.filter, 0, msg, keysAndValues...)
} }
} }

2
vendor/modules.txt vendored
View File

@ -1190,7 +1190,7 @@ k8s.io/component-helpers/node/util/sysctl
k8s.io/component-helpers/scheduling/corev1 k8s.io/component-helpers/scheduling/corev1
k8s.io/component-helpers/scheduling/corev1/nodeaffinity k8s.io/component-helpers/scheduling/corev1/nodeaffinity
k8s.io/component-helpers/storage/volume k8s.io/component-helpers/storage/volume
# k8s.io/klog/v2 v2.90.0 # k8s.io/klog/v2 v2.100.1
## explicit; go 1.13 ## explicit; go 1.13
k8s.io/klog/v2 k8s.io/klog/v2
k8s.io/klog/v2/internal/buffer k8s.io/klog/v2/internal/buffer