mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 12:43:23 +00:00
Merge pull request #105539 from pohly/log-registry
component-base/logs: refactor registry
This commit is contained in:
commit
0894dfa204
@ -26,6 +26,7 @@ import (
|
|||||||
|
|
||||||
cliflag "k8s.io/component-base/cli/flag"
|
cliflag "k8s.io/component-base/cli/flag"
|
||||||
"k8s.io/component-base/config"
|
"k8s.io/component-base/config"
|
||||||
|
"k8s.io/component-base/logs/registry"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -35,16 +36,13 @@ const (
|
|||||||
JSONLogFormat = "json"
|
JSONLogFormat = "json"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LogRegistry is new init LogFormatRegistry struct
|
|
||||||
var LogRegistry = NewLogFormatRegistry()
|
|
||||||
|
|
||||||
// loggingFlags captures the state of the logging flags, in particular their default value
|
// loggingFlags captures the state of the logging flags, in particular their default value
|
||||||
// before flag parsing. It is used by UnsupportedLoggingFlags.
|
// before flag parsing. It is used by UnsupportedLoggingFlags.
|
||||||
var loggingFlags pflag.FlagSet
|
var loggingFlags pflag.FlagSet
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
// Text format is default klog format
|
// Text format is default klog format
|
||||||
LogRegistry.Register(DefaultLogFormat, nil)
|
registry.LogRegistry.Register(DefaultLogFormat, nil)
|
||||||
|
|
||||||
var fs flag.FlagSet
|
var fs flag.FlagSet
|
||||||
klog.InitFlags(&fs)
|
klog.InitFlags(&fs)
|
||||||
@ -63,10 +61,10 @@ func BindLoggingFlags(c *config.LoggingConfiguration, fs *pflag.FlagSet) {
|
|||||||
// hyphens, even if currently no normalization function is set for the
|
// hyphens, even if currently no normalization function is set for the
|
||||||
// flag set yet.
|
// flag set yet.
|
||||||
unsupportedFlags := strings.Join(unsupportedLoggingFlagNames(cliflag.WordSepNormalizeFunc), ", ")
|
unsupportedFlags := strings.Join(unsupportedLoggingFlagNames(cliflag.WordSepNormalizeFunc), ", ")
|
||||||
formats := fmt.Sprintf(`"%s"`, strings.Join(LogRegistry.List(), `", "`))
|
formats := fmt.Sprintf(`"%s"`, strings.Join(registry.LogRegistry.List(), `", "`))
|
||||||
fs.StringVar(&c.Format, "logging-format", c.Format, fmt.Sprintf("Sets the log format. Permitted formats: %s.\nNon-default formats don't honor these flags: %s.\nNon-default choices are currently alpha and subject to change without warning.", formats, unsupportedFlags))
|
fs.StringVar(&c.Format, "logging-format", c.Format, fmt.Sprintf("Sets the log format. Permitted formats: %s.\nNon-default formats don't honor these flags: %s.\nNon-default choices are currently alpha and subject to change without warning.", formats, unsupportedFlags))
|
||||||
// No new log formats should be added after generation is of flag options
|
// No new log formats should be added after generation is of flag options
|
||||||
LogRegistry.Freeze()
|
registry.LogRegistry.Freeze()
|
||||||
fs.BoolVar(&c.Sanitization, "experimental-logging-sanitization", c.Sanitization, `[Experimental] When enabled prevents logging of fields tagged as sensitive (passwords, keys, tokens).
|
fs.BoolVar(&c.Sanitization, "experimental-logging-sanitization", c.Sanitization, `[Experimental] When enabled prevents logging of fields tagged as sensitive (passwords, keys, tokens).
|
||||||
Runtime log sanitization may introduce significant computation overhead and therefore should not be enabled in production.`)
|
Runtime log sanitization may introduce significant computation overhead and therefore should not be enabled in production.`)
|
||||||
}
|
}
|
||||||
|
@ -24,20 +24,15 @@ import (
|
|||||||
"github.com/go-logr/zapr"
|
"github.com/go-logr/zapr"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"go.uber.org/zap/zapcore"
|
"go.uber.org/zap/zapcore"
|
||||||
|
|
||||||
|
"k8s.io/component-base/logs/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// JSONLogger is global json log format logr
|
|
||||||
JSONLogger logr.Logger
|
|
||||||
|
|
||||||
// timeNow stubbed out for testing
|
// timeNow stubbed out for testing
|
||||||
timeNow = time.Now
|
timeNow = time.Now
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
|
||||||
JSONLogger = NewJSONLogger(zapcore.Lock(os.Stdout))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewJSONLogger creates a new json logr.Logger using the given Zap Logger to log.
|
// NewJSONLogger creates a new json logr.Logger using the given Zap Logger to log.
|
||||||
func NewJSONLogger(w zapcore.WriteSyncer) logr.Logger {
|
func NewJSONLogger(w zapcore.WriteSyncer) logr.Logger {
|
||||||
encoder := zapcore.NewJSONEncoder(encoderConfig)
|
encoder := zapcore.NewJSONEncoder(encoderConfig)
|
||||||
@ -63,3 +58,12 @@ func epochMillisTimeEncoder(_ time.Time, enc zapcore.PrimitiveArrayEncoder) {
|
|||||||
millis := float64(nanos) / float64(time.Millisecond)
|
millis := float64(nanos) / float64(time.Millisecond)
|
||||||
enc.AppendFloat64(millis)
|
enc.AppendFloat64(millis)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Factory produces JSON logger instances.
|
||||||
|
type Factory struct{}
|
||||||
|
|
||||||
|
func (f Factory) Create() logr.Logger {
|
||||||
|
return NewJSONLogger(zapcore.Lock(os.Stdout))
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ registry.LogFormatFactory = Factory{}
|
||||||
|
@ -19,9 +19,10 @@ package register
|
|||||||
import (
|
import (
|
||||||
"k8s.io/component-base/logs"
|
"k8s.io/component-base/logs"
|
||||||
json "k8s.io/component-base/logs/json"
|
json "k8s.io/component-base/logs/json"
|
||||||
|
"k8s.io/component-base/logs/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
// JSON format is optional klog format
|
// JSON format is optional klog format
|
||||||
logs.LogRegistry.Register(logs.JSONLogFormat, &json.JSONLogger)
|
registry.LogRegistry.Register(logs.JSONLogFormat, json.Factory{})
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import (
|
|||||||
|
|
||||||
"k8s.io/component-base/config"
|
"k8s.io/component-base/config"
|
||||||
"k8s.io/component-base/config/v1alpha1"
|
"k8s.io/component-base/config/v1alpha1"
|
||||||
|
"k8s.io/component-base/logs/registry"
|
||||||
"k8s.io/component-base/logs/sanitization"
|
"k8s.io/component-base/logs/sanitization"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -58,11 +59,11 @@ func (o *Options) AddFlags(fs *pflag.FlagSet) {
|
|||||||
// Apply set klog logger from LogFormat type
|
// Apply set klog logger from LogFormat type
|
||||||
func (o *Options) Apply() {
|
func (o *Options) Apply() {
|
||||||
// if log format not exists, use nil loggr
|
// if log format not exists, use nil loggr
|
||||||
loggr, _ := LogRegistry.Get(o.Config.Format)
|
factory, _ := registry.LogRegistry.Get(o.Config.Format)
|
||||||
if loggr == nil {
|
if factory == nil {
|
||||||
klog.ClearLogger()
|
klog.ClearLogger()
|
||||||
} else {
|
} else {
|
||||||
klog.SetLogger(*loggr)
|
klog.SetLogger(factory.Create())
|
||||||
}
|
}
|
||||||
if o.Config.Sanitization {
|
if o.Config.Sanitization {
|
||||||
klog.SetLogFilter(&sanitization.SanitizingFilter{})
|
klog.SetLogFilter(&sanitization.SanitizingFilter{})
|
||||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package logs
|
package registry
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -23,35 +23,45 @@ import (
|
|||||||
"github.com/go-logr/logr"
|
"github.com/go-logr/logr"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// LogRegistry is new init LogFormatRegistry struct
|
||||||
|
var LogRegistry = NewLogFormatRegistry()
|
||||||
|
|
||||||
// LogFormatRegistry store klog format registry
|
// LogFormatRegistry store klog format registry
|
||||||
type LogFormatRegistry struct {
|
type LogFormatRegistry struct {
|
||||||
registry map[string]*logr.Logger
|
registry map[string]LogFormatFactory
|
||||||
frozen bool
|
frozen bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LogFormatFactory provides support for a certain additional,
|
||||||
|
// non-default log format.
|
||||||
|
type LogFormatFactory interface {
|
||||||
|
// Create returns a logger.
|
||||||
|
Create() logr.Logger
|
||||||
|
}
|
||||||
|
|
||||||
// NewLogFormatRegistry return new init LogFormatRegistry struct
|
// NewLogFormatRegistry return new init LogFormatRegistry struct
|
||||||
func NewLogFormatRegistry() *LogFormatRegistry {
|
func NewLogFormatRegistry() *LogFormatRegistry {
|
||||||
return &LogFormatRegistry{
|
return &LogFormatRegistry{
|
||||||
registry: make(map[string]*logr.Logger),
|
registry: make(map[string]LogFormatFactory),
|
||||||
frozen: false,
|
frozen: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register new log format registry to global logRegistry.
|
// Register new log format registry to global logRegistry.
|
||||||
// nil is valid and selects the default klog output.
|
// nil is valid and selects the default klog output.
|
||||||
func (lfr *LogFormatRegistry) Register(name string, logger *logr.Logger) error {
|
func (lfr *LogFormatRegistry) Register(name string, factory LogFormatFactory) error {
|
||||||
if lfr.frozen {
|
if lfr.frozen {
|
||||||
return fmt.Errorf("log format is frozen, unable to register log format")
|
return fmt.Errorf("log format is frozen, unable to register log format")
|
||||||
}
|
}
|
||||||
if _, ok := lfr.registry[name]; ok {
|
if _, ok := lfr.registry[name]; ok {
|
||||||
return fmt.Errorf("log format: %s already exists", name)
|
return fmt.Errorf("log format: %s already exists", name)
|
||||||
}
|
}
|
||||||
lfr.registry[name] = logger
|
lfr.registry[name] = factory
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get specified log format logger
|
// Get specified log format logger
|
||||||
func (lfr *LogFormatRegistry) Get(name string) (*logr.Logger, error) {
|
func (lfr *LogFormatRegistry) Get(name string) (LogFormatFactory, error) {
|
||||||
re, ok := lfr.registry[name]
|
re, ok := lfr.registry[name]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("log format: %s does not exists", name)
|
return nil, fmt.Errorf("log format: %s does not exists", name)
|
||||||
@ -60,12 +70,12 @@ func (lfr *LogFormatRegistry) Get(name string) (*logr.Logger, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set specified log format logger
|
// Set specified log format logger
|
||||||
func (lfr *LogFormatRegistry) Set(name string, logger *logr.Logger) error {
|
func (lfr *LogFormatRegistry) Set(name string, factory LogFormatFactory) error {
|
||||||
if lfr.frozen {
|
if lfr.frozen {
|
||||||
return fmt.Errorf("log format is frozen, unable to set log format")
|
return fmt.Errorf("log format is frozen, unable to set log format")
|
||||||
}
|
}
|
||||||
|
|
||||||
lfr.registry[name] = logger
|
lfr.registry[name] = factory
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -22,6 +22,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
cliflag "k8s.io/component-base/cli/flag"
|
cliflag "k8s.io/component-base/cli/flag"
|
||||||
"k8s.io/component-base/config"
|
"k8s.io/component-base/config"
|
||||||
|
"k8s.io/component-base/logs/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ValidateLoggingConfiguration(c *config.LoggingConfiguration, fldPath *field.Path) field.ErrorList {
|
func ValidateLoggingConfiguration(c *config.LoggingConfiguration, fldPath *field.Path) field.ErrorList {
|
||||||
@ -36,7 +37,7 @@ func ValidateLoggingConfiguration(c *config.LoggingConfiguration, fldPath *field
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if _, err := LogRegistry.Get(c.Format); err != nil {
|
if _, err := registry.LogRegistry.Get(c.Format); err != nil {
|
||||||
errs = append(errs, field.Invalid(fldPath.Child("format"), c.Format, "Unsupported log format"))
|
errs = append(errs, field.Invalid(fldPath.Child("format"), c.Format, "Unsupported log format"))
|
||||||
}
|
}
|
||||||
return errs
|
return errs
|
||||||
|
1
vendor/modules.txt
vendored
1
vendor/modules.txt
vendored
@ -1952,6 +1952,7 @@ k8s.io/component-base/logs/datapol
|
|||||||
k8s.io/component-base/logs/json
|
k8s.io/component-base/logs/json
|
||||||
k8s.io/component-base/logs/json/register
|
k8s.io/component-base/logs/json/register
|
||||||
k8s.io/component-base/logs/logreduction
|
k8s.io/component-base/logs/logreduction
|
||||||
|
k8s.io/component-base/logs/registry
|
||||||
k8s.io/component-base/logs/sanitization
|
k8s.io/component-base/logs/sanitization
|
||||||
k8s.io/component-base/logs/testinit
|
k8s.io/component-base/logs/testinit
|
||||||
k8s.io/component-base/metrics
|
k8s.io/component-base/metrics
|
||||||
|
Loading…
Reference in New Issue
Block a user