Add configurable log level for pulse-sensor-proxy

Users can now control logging verbosity through:
- YAML config file: log_level: "debug|info|warn|error"
- Environment variable: PULSE_SENSOR_PROXY_LOG_LEVEL

Default log level is set to "info" instead of debug, reducing verbose output.
Supported levels: trace, debug, info, warn, error, fatal, panic, disabled

Related to #629
This commit is contained in:
rcourtman 2025-11-05 19:48:00 +00:00
parent 23691d5b41
commit 930ad20921
2 changed files with 39 additions and 1 deletions

View file

@ -21,6 +21,7 @@ type RateLimitConfig struct {
type Config struct {
AllowedSourceSubnets []string `yaml:"allowed_source_subnets"`
MetricsAddress string `yaml:"metrics_address"`
LogLevel string `yaml:"log_level"`
AllowIDMappedRoot bool `yaml:"allow_idmapped_root"`
AllowedPeerUIDs []uint32 `yaml:"allowed_peer_uids"`
@ -35,6 +36,7 @@ func loadConfig(configPath string) (*Config, error) {
cfg := &Config{
AllowIDMappedRoot: true,
AllowedIDMapUsers: []string{"root"},
LogLevel: "info", // Default log level
}
// Try to load config file if it exists
@ -166,6 +168,12 @@ func loadConfig(configPath string) (*Config, error) {
Msg("Rate limit configuration loaded from config file")
}
// Log level from environment variable
if envLogLevel := os.Getenv("PULSE_SENSOR_PROXY_LOG_LEVEL"); envLogLevel != "" {
cfg.LogLevel = strings.ToLower(strings.TrimSpace(envLogLevel))
log.Info().Str("log_level", cfg.LogLevel).Msg("Log level set from environment")
}
return cfg, nil
}

View file

@ -85,6 +85,31 @@ func main() {
}
}
// parseLogLevel converts a string log level to zerolog.Level
func parseLogLevel(levelStr string) zerolog.Level {
switch strings.ToLower(strings.TrimSpace(levelStr)) {
case "trace":
return zerolog.TraceLevel
case "debug":
return zerolog.DebugLevel
case "info":
return zerolog.InfoLevel
case "warn", "warning":
return zerolog.WarnLevel
case "error":
return zerolog.ErrorLevel
case "fatal":
return zerolog.FatalLevel
case "panic":
return zerolog.PanicLevel
case "disabled", "none":
return zerolog.Disabled
default:
log.Warn().Str("level", levelStr).Msg("Unknown log level, defaulting to info")
return zerolog.InfoLevel
}
}
type userSpec struct {
name string
uid int
@ -276,7 +301,7 @@ type RPCResponse struct {
type handlerFunc func(ctx context.Context, req *RPCRequest, logger zerolog.Logger) (interface{}, error)
func runProxy() {
// Initialize logger
// Initialize logger with default level (will be configured after loading config)
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
@ -305,6 +330,10 @@ func runProxy() {
log.Fatal().Err(err).Msg("Failed to load configuration")
}
// Apply configured log level
level := parseLogLevel(cfg.LogLevel)
zerolog.SetGlobalLevel(level)
runAsUser := os.Getenv("PULSE_SENSOR_PROXY_USER")
if runAsUser == "" {
runAsUser = defaultRunAsUser
@ -339,6 +368,7 @@ func runProxy() {
Str("ssh_key_dir", sshKeyPath).
Str("config_path", cfgPath).
Str("audit_log", auditPath).
Str("log_level", cfg.LogLevel).
Str("version", Version).
Msg("Starting pulse-sensor-proxy")