Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

structured logging text output: handle arbitrary values #106428

Copy link
Copy link
@pohly

Description

@pohly
Issue body actions

What happened?

The klog.InfoS output was meant to machine readable. In particular it should be possible to split the log output into individual messages.

The argument in kubernetes/klog#268 (comment) was that the klog header can be used to split the output, the same way as current log parsers already do it (backwards compatibility).

That approach does not work when a struct gets logged as value in a key/value pair and that struct contains multi-line data which contains klog headers.

What did you expect to happen?

One of the following would solve the problem:

  • document how values are logged in text mode and update Kubernetes log parsers accordingly so that they handle corner cases correctly
  • quote structs (but not simple types like ints) - this is actually what's currently in the KEP, it's just wasn't implemented at the end
  • switch to a different text format with indention (structured logging: support log messages with line breaks klog#268)

How can we reproduce it (as minimally and precisely as possible)?

type MyStruct struct {
	Name     string
	Data     string
	internal int
}

func main() {
	klog.InitFlags(nil)
	flag.Parse()

	logData := MyStruct{
		Name: "log output from some program",
		Data: `I0000 12:00:00.000000  123456 main.go:42] Starting
E0000 12:00:01.000000  123456 main.go:43] Failed for some reason
`,
	}
	klog.V(0).InfoS("using InfoS", "logData", logData)
}

This currently prints:

I1115 19:05:02.598278  142908 structured_logging.go:65] "using InfoS" logData={Name:log output from some program Data:I0000 12:00:00.000000  123456 main.go:42] Starting
E0000 12:00:01.000000  123456 main.go:43] Failed for some reason
 internal:0}

Anything else we need to know?

IMHO text output does not need to be machine-readable, so I favor the third solution because it also addresses #104868 without reverting to non-structured logging.

Kubernetes version

1.23 and older

Cloud provider

n/a

OS version

No response

Install tools

n/a

Container runtime (CRI) and and version (if applicable)

No response

Related plugins (CNI, CSI, ...) and versions (if applicable)

No response

Metadata

Metadata

Assignees

Labels

kind/bugCategorizes issue or PR as related to a bug.Categorizes issue or PR as related to a bug.sig/instrumentationCategorizes an issue or PR as relevant to SIG Instrumentation.Categorizes an issue or PR as relevant to SIG Instrumentation.triage/acceptedIndicates an issue or PR is ready to be actively worked on.Indicates an issue or PR is ready to be actively worked on.wg/structured-loggingCategorizes an issue or PR as relevant to WG Structured Logging.Categorizes an issue or PR as relevant to WG Structured Logging.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    Morty Proxy This is a proxified and sanitized view of the page, visit original site.