headlamp
headlamp copied to clipboard
Format backend log to easily be parsed by log platform
Headlamp backend server log isn't easy to recognized by log platform. For example. azure app service will take all headlamp backend log as error level.
I have classified logger to refer:
package main
import (
"fmt"
"io"
"log"
)
type Level int
const (
LevelInfo Level = iota
LevelWarning
LevelError
)
type CustomLogger struct {
logger *log.Logger
level Level
}
func (c *CustomLogger) init(out io.Writer, level Level) {
c.logger = log.New(out, "", 0)
c.level = level
}
func (c *CustomLogger) output(level Level, format string, v ...interface{}) {
if level >= c.level {
levelText := [...]string{"[INFO] ", "[WARNING] ", "[ERROR] "}
message := fmt.Sprintf("%s%s", levelText[level], fmt.Sprintf(format, v...))
c.logger.Printf("%s", message)
}
}
func (c *CustomLogger) Info(format string, v ...interface{}) {
c.output(LevelInfo, format, v...)
}
func (c *CustomLogger) Warning(format string, v ...interface{}) {
c.output(LevelWarning, format, v...)
}
func (c *CustomLogger) Error(format string, v ...interface{}) {
c.output(LevelError, format, v...)
}
var logger = CustomLogger{}
use logger:
func setupProxyForContext(context *Context, config *HeadlampConfig, source int) error {
proxy, err := config.createProxyForContext(*context)
if err != nil {
logger.Info("Error setting up proxy for context %s: %s\n", context.Name, err)
return err
}
_, isReplacement := config.contextProxies[context.Name]
if isReplacement {
logger.Info("Replaced cluster \"%s\" proxy by:\n", context.Name)
} else {
logger.Info("Created new cluster proxy:")
}
logger.Info("\tlocalhost:%d%s%s/{api...} -> %s\n", config.port, config.baseURL, "/clusters/"+context.Name,
*context.cluster.getServer())
config.contextProxies[context.Name] = contextProxy{
context,
proxy,
source,
}
return nil
}
It will show up like:
I find a related log level standards. https://learn.microsoft.com/en-us/azure/developer/java/sdk/logging-overview#default-logger-for-temporary-debugging
Working on this