Logging

The Go SDK integrates with the onelog project, almost out of the box.

The project has chosen this library as:

  • It works with WebAssembly binaries. Other popular logging solutions can’t compile to target WebAssembly.

  • It provides good performance.

  • It supports structured logging.

Initialize logger

You need to initialize a logger structure. By performing this initialization in a global variable, you can log from the two main policy entry points: validate and validate_settings.

In the main package, main.go there is initialization for the logger:

var (
    logWriter = kubewarden.KubewardenLogWriter{}
    logger    = onelog.New(
        &logWriter,
        onelog.ALL, // shortcut for onelog.DEBUG|onelog.INFO|onelog.WARN|onelog.ERROR|onelog.FATAL
    )
)

Consuming the logger

Now, you can use the logger object to log from wherever required your policy:

func validate(payload []byte) ([]byte, error) {
    // ...
    logger.Info("validating request")
    // ...
}

You can add structured logging:

func validate(payload []byte) ([]byte, error) {
    // ...
    logger.WarnWithFields("logging something important", func(e onelog.Entry) {
        e.String("one_field", "a value")
        e.String("another_field", "another value")
    })
    // ...
}

You can refer to the onelog documentation for more information.

Policy logging goes to the policy evaluator (for example, kwctl or policy-server), and they log on behalf of the policy. They use mechanisms that are interoperable with other components that enable distributed tracing such as Jaeger.