🔧 config: add log output file configuration and cleanup example files

This commit is contained in:
2026-04-04 13:54:59 +02:00
parent c41611281b
commit 25d8940db4
7 changed files with 98 additions and 74 deletions

1
.gitignore vendored
View File

@@ -20,3 +20,4 @@ go.work
# Server runtime files
server.log
server.pid
*.log

View File

@@ -156,6 +156,7 @@ The server supports flexible configuration through environment variables with th
| Port | `DLC_SERVER_PORT` | `8080` | Server listening port |
| Shutdown Timeout | `DLC_SHUTDOWN_TIMEOUT` | `30s` | Graceful shutdown timeout |
| JSON Logging | `DLC_LOGGING_JSON` | `false` | Enable JSON format logging |
| Log Output | `DLC_LOGGING_OUTPUT` | `""` | Log output file path (empty for stderr) |
**Usage Examples:**
@@ -176,6 +177,15 @@ export DLC_SHUTDOWN_TIMEOUT=45s
# Enable JSON logging
export DLC_LOGGING_JSON=true
./scripts/start-server.sh start
# Log to file
export DLC_LOGGING_OUTPUT="server.log"
./scripts/start-server.sh start
# Combined: JSON logging to file
export DLC_LOGGING_JSON=true
export DLC_LOGGING_OUTPUT="server.json.log"
./scripts/start-server.sh start
```
**Configuration File Support:**

View File

@@ -2,6 +2,7 @@ package main
import (
"context"
"os"
"DanceLessonsCoach/pkg/config"
"DanceLessonsCoach/pkg/server"
@@ -15,6 +16,9 @@ func main() {
log.Fatal().Err(err).Msg("Failed to load configuration")
}
// Setup log output based on configuration
setupLogOutput(cfg)
// Create readiness context to control readiness state
readyCtx, readyCancel := context.WithCancel(context.Background())
defer readyCancel()
@@ -25,3 +29,23 @@ func main() {
log.Fatal().Err(err).Msg("Server failed")
}
}
// setupLogOutput configures the log output based on configuration
func setupLogOutput(cfg *config.Config) {
output := cfg.GetLogOutput()
if output == "" {
// Use stderr by default
return
}
// Open the log file
file, err := os.OpenFile(output, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Error().Err(err).Str("output", output).Msg("Failed to open log file, using stderr")
return
}
// Set the log output
log.Logger = log.Output(file)
log.Info().Str("output", output).Msg("Logging to file")
}

View File

@@ -1,66 +0,0 @@
# DanceLessonsCoach Configuration Example
# This file shows the available configuration options
# You can use this as a template for your own configuration
# Server configuration
server:
# Host address to bind to (default: "0.0.0.0")
host: "0.0.0.0"
# Port to listen on (default: 8080)
port: 8080
# Shutdown configuration
shutdown:
# Timeout duration for graceful shutdown (default: 30s)
# Format: number + unit (s, m, h)
timeout: 30s
# Logging configuration
logging:
# Enable JSON output for structured logging (default: false)
# When true, logs are output in JSON format instead of console format
json: false
# Log level (default: "trace")
# Options: "trace", "debug", "info", "warn", "error", "fatal", "panic"
level: trace
# Telemetry configuration (OpenTelemetry)
telemetry:
# Enable OpenTelemetry tracing (default: false)
enabled: false
# OTLP endpoint for trace export (default: "localhost:4317")
# Format: host:port
otlp_endpoint: "localhost:4317"
# Service name for tracing (default: "DanceLessonsCoach")
service_name: "DanceLessonsCoach"
# Use insecure connection (no TLS) (default: true)
insecure: true
# Sampler configuration
sampler:
# Sampler type (default: "parentbased_always_on")
# Options: "always_on", "always_off", "traceidratio", "parentbased_always_on", "parentbased_always_off", "parentbased_traceidratio"
type: "parentbased_always_on"
# Sampling ratio (0.0 to 1.0, default: 1.0)
# Only used with traceidratio and parentbased_traceidratio samplers
ratio: 1.0
# Environment Variables
# You can also configure via environment variables with DLC_ prefix:
# DLC_SERVER_HOST=0.0.0.0
# DLC_SERVER_PORT=8080
# DLC_SHUTDOWN_TIMEOUT=30s
# DLC_LOGGING_JSON=false
# DLC_LOGGING_LEVEL=trace
# DLC_TELEMETRY_ENABLED=true
# DLC_TELEMETRY_OTLP_ENDPOINT="jaeger:4317"
# DLC_TELEMETRY_SERVICE_NAME="DanceLessonsCoach"
# DLC_TELEMETRY_INSECURE=true
# DLC_TELEMETRY_SAMPLER_TYPE="parentbased_always_on"
# DLC_TELEMETRY_SAMPLER_RATIO=1.0

View File

@@ -1,7 +0,0 @@
server:
host: "0.0.0.0"
port: 8080
shutdown:
timeout: 5s
logging:
json: true

View File

@@ -1,5 +1,58 @@
# DanceLessonsCoach Configuration
# This file serves as both the default configuration and documentation
# All available options are shown with their default values
# Server configuration
server:
# Host address to bind to (default: "0.0.0.0")
host: "0.0.0.0"
# Port to listen on (default: 8080)
port: 8080
# Shutdown configuration
shutdown:
timeout: 5s
# Timeout duration for graceful shutdown (default: 30s)
# Format: number + unit (s, m, h)
timeout: 30s
# Logging configuration
logging:
# Enable JSON output for structured logging (default: false)
# When true, logs are output in JSON format instead of console format
json: false
# Log level (default: "trace")
# Options: "trace", "debug", "info", "warn", "error", "fatal", "panic"
level: trace
# Log output file path (default: "" for stderr)
# If empty, logs will be written to stderr
# If specified, logs will be written to the specified file
# Example: "server.log" or "/var/log/dance-lessons-coach.log"
output: ""
# Telemetry configuration (OpenTelemetry)
telemetry:
# Enable OpenTelemetry tracing (default: false)
enabled: false
# OTLP endpoint for trace export (default: "localhost:4317")
# Format: host:port
otlp_endpoint: "localhost:4317"
# Service name for tracing (default: "DanceLessonsCoach")
service_name: "DanceLessonsCoach"
# Use insecure connection (no TLS) (default: true)
insecure: true
# Sampler configuration
sampler:
# Sampler type (default: "parentbased_always_on")
# Options: "always_on", "always_off", "traceidratio", "parentbased_always_on", "parentbased_always_off", "parentbased_traceidratio"
type: "parentbased_always_on"
# Sampling ratio (0.0 to 1.0, default: 1.0)
# Only used with traceidratio and parentbased_traceidratio samplers
ratio: 1.0

View File

@@ -34,6 +34,7 @@ type ShutdownConfig struct {
type LoggingConfig struct {
JSON bool `mapstructure:"json"`
Level string `mapstructure:"level"`
Output string `mapstructure:"output"`
}
// TelemetryConfig holds OpenTelemetry-related configuration
@@ -67,6 +68,7 @@ func LoadConfig() (*Config, error) {
v.SetDefault("shutdown.timeout", 30*time.Second)
v.SetDefault("logging.json", false)
v.SetDefault("logging.level", "trace")
v.SetDefault("logging.output", "")
// Telemetry defaults
v.SetDefault("telemetry.enabled", false)
@@ -106,6 +108,7 @@ func LoadConfig() (*Config, error) {
v.BindEnv("shutdown.timeout", "DLC_SHUTDOWN_TIMEOUT")
v.BindEnv("logging.json", "DLC_LOGGING_JSON")
v.BindEnv("logging.level", "DLC_LOGGING_LEVEL")
v.BindEnv("logging.output", "DLC_LOGGING_OUTPUT")
// Telemetry environment variables
v.BindEnv("telemetry.enabled", "DLC_TELEMETRY_ENABLED")
@@ -139,6 +142,7 @@ func LoadConfig() (*Config, error) {
Dur("shutdown_timeout", config.Shutdown.Timeout).
Bool("logging_json", config.Logging.JSON).
Str("logging_level", config.Logging.Level).
Str("logging_output", config.Logging.Output).
Bool("telemetry_enabled", config.Telemetry.Enabled).
Str("telemetry_service", config.Telemetry.ServiceName).
Msg("Configuration loaded")
@@ -186,6 +190,11 @@ func (c *Config) GetLogLevel() string {
return c.Logging.Level
}
// GetLogOutput returns the log output path
func (c *Config) GetLogOutput() string {
return c.Logging.Output
}
// SetupLogging configures zerolog based on the configuration
func (c *Config) SetupLogging() {
// Parse log level