Files
log/example/sink/main.go

155 lines
4.7 KiB
Go

// FILE: main.go
package main
import (
"fmt"
"os"
"time"
"github.com/lixenwraith/log"
)
const (
logDirectory = "./temp_logs"
logInterval = 200 * time.Millisecond // Shorter interval for quicker tests
)
// main orchestrates the different test scenarios.
func main() {
// Ensure a clean state by removing the previous log directory.
if err := os.RemoveAll(logDirectory); err != nil {
fmt.Printf("Warning: could not remove old log directory: %v\n", err)
}
if err := os.MkdirAll(logDirectory, 0755); err != nil {
fmt.Printf("Fatal: could not create log directory: %v\n", err)
os.Exit(1)
}
fmt.Println("--- Running Logger Test Suite ---")
fmt.Printf("! All file-based logs will be in the '%s' directory.\n\n", logDirectory)
// --- Scenario 1: Test different configurations on fresh logger instances ---
fmt.Println("--- SCENARIO 1: Testing configurations in isolation (new logger per test) ---")
testFileOnly()
testStdoutOnly()
testStderrOnly()
testNoOutput()
// --- Scenario 2: Test reconfiguration on a single logger instance ---
fmt.Println("\n--- SCENARIO 2: Testing reconfiguration on a single logger instance ---")
testReconfigurationTransitions()
fmt.Println("\n--- Logger Test Suite Complete ---")
fmt.Printf("Check the '%s' directory for log files.\n", logDirectory)
}
// testFileOnly tests the default behavior: writing only to a file.
func testFileOnly() {
logger := log.NewLogger()
runTestPhase(logger, "1.1: File-Only",
"directory="+logDirectory,
"name=file_only_log", // Give it a unique name
"level=-4",
)
shutdownLogger(logger, "1.1: File-Only")
}
// testStdoutOnly tests writing only to the standard output.
func testStdoutOnly() {
logger := log.NewLogger()
runTestPhase(logger, "1.2: Stdout-Only",
"enable_stdout=true",
"disable_file=true", // Explicitly disable file
"level=-4",
)
shutdownLogger(logger, "1.2: Stdout-Only")
}
// testStderrOnly tests writing only to the standard error stream.
func testStderrOnly() {
fmt.Fprintln(os.Stderr, "\n---") // Separator for stderr output
logger := log.NewLogger()
runTestPhase(logger, "1.3: Stderr-Only",
"enable_stdout=true",
"stdout_target=stderr",
"disable_file=true",
"level=-4",
)
fmt.Fprintln(os.Stderr, "---") // Separator for stderr output
shutdownLogger(logger, "1.3: Stderr-Only")
}
// testNoOutput tests a configuration where all logging is disabled.
func testNoOutput() {
logger := log.NewLogger()
runTestPhase(logger, "1.4: No-Output (logs should be dropped)",
"enable_stdout=false", // Ensure stdout is off
"disable_file=true", // Ensure file is off
"level=-4",
)
shutdownLogger(logger, "1.4: No-Output")
}
// testReconfigurationTransitions tests the logger's ability to handle state changes.
func testReconfigurationTransitions() {
logger := log.NewLogger()
// Phase A: Start with dual output
runTestPhase(logger, "2.1: Reconfig - Initial (Dual File+Stdout)",
"directory="+logDirectory,
"name=reconfig_log",
"enable_stdout=true",
"disable_file=false",
"level=-4",
)
// Phase B: Transition to file-disabled
runTestPhase(logger, "2.2: Reconfig - Transition to Stdout-Only",
"enable_stdout=true",
"disable_file=true", // The key change
"level=-4",
)
// Phase C: Transition back to dual-output. This is the critical test.
runTestPhase(logger, "2.3: Reconfig - Transition back to Dual (File+Stdout)",
"directory="+logDirectory, // Re-specify directory
"name=reconfig_log",
"enable_stdout=true",
"disable_file=false", // Re-enable file
"level=-4",
)
// Phase D: Test different levels on the final reconfigured state
fmt.Println("\n[Phase 2.4: Reconfig - Testing log levels on final state]")
logger.Debug("final-state", "This is a debug message.")
logger.Info("final-state", "This is an info message.")
logger.Warn("final-state", "This is a warning message.")
logger.Error("final-state", "This is an error message.")
time.Sleep(logInterval)
shutdownLogger(logger, "2: Reconfiguration")
}
// runTestPhase is a helper to initialize and run a standard logging test.
func runTestPhase(logger *log.Logger, phaseName string, overrides ...string) {
fmt.Printf("\n[Phase %s]\n", phaseName)
fmt.Println(" Config:", overrides)
err := logger.InitWithDefaults(overrides...)
if err != nil {
fmt.Printf(" ERROR: Failed to initialize/reconfigure logger: %v\n", err)
os.Exit(1)
}
logger.Info("event", "start_phase", "name", phaseName)
time.Sleep(logInterval)
logger.Info("event", "end_phase", "name", phaseName)
time.Sleep(logInterval) // Give time for flush
}
// shutdownLogger is a helper to gracefully shut down the logger instance.
func shutdownLogger(l *log.Logger, phaseName string) {
if err := l.Shutdown(500 * time.Millisecond); err != nil {
fmt.Printf(" WARNING: Shutdown error in phase '%s': %v\n", phaseName, err)
}
}