From aec103063f83f9a3c35f0fbfc13ab85db1e05eaa Mon Sep 17 00:00:00 2001 From: EnumDev Date: Wed, 19 Mar 2025 15:34:47 +0200 Subject: [PATCH] Add simple service logging --- cmd/esvm/go.mod | 2 +- cmd/esvm/go.sum | 1 + cmd/esvm/main.go | 83 ++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 79 insertions(+), 7 deletions(-) diff --git a/cmd/esvm/go.mod b/cmd/esvm/go.mod index 8e7b3d6..ba1472c 100644 --- a/cmd/esvm/go.mod +++ b/cmd/esvm/go.mod @@ -2,4 +2,4 @@ module esvm go 1.23.4 -require gopkg.in/yaml.v3 v3.0.1 // indirect +require gopkg.in/yaml.v3 v3.0.1 diff --git a/cmd/esvm/go.sum b/cmd/esvm/go.sum index 4bc0337..a62c313 100644 --- a/cmd/esvm/go.sum +++ b/cmd/esvm/go.sum @@ -1,3 +1,4 @@ +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/cmd/esvm/main.go b/cmd/esvm/main.go index 65a678c..2b729db 100644 --- a/cmd/esvm/main.go +++ b/cmd/esvm/main.go @@ -39,6 +39,7 @@ type EnitService struct { CrashOnSafeExit bool `yaml:"crash_on_safe_exit"` StopCmd string `yaml:"stop_cmd,omitempty"` Restart string `yaml:"restart,omitempty"` + LogOutput bool `yaml:"log_output,omitempty"` ServiceRunPath string restartCount int stopChannel chan bool @@ -57,13 +58,12 @@ var logger *log.Logger var socket net.Listener func main() { - loggerFile, err := os.OpenFile("/var/log/esvm.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + // Setup main logger + err := setupESVMLogger() if err != nil { - log.Fatalf("Error opening /var/log/esvm/esvm.log: %v", err) + log.Printf("Could not setup main ESVM logger! Error: %s\n", err) + logger = log.Default() } - logger = log.New(loggerFile, "[ESVM] ", log.Lshortfile|log.LstdFlags) - // Print an empty line as separator - logger.Println() // Parse flags printVersion := flag.Bool("version", false, "print version and exit") @@ -93,7 +93,6 @@ func main() { go func() { <-sigc Destroy() - loggerFile.Close() os.Exit(0) }() @@ -102,6 +101,22 @@ func main() { } } +func setupESVMLogger() error { + err := os.MkdirAll("/var/log/esvm", 0755) + if err != nil { + return err + } + loggerFile, err := os.OpenFile("/var/log/esvm/esvm.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil { + return err + } + logger = log.New(loggerFile, "[ESVM] ", log.Lshortfile|log.LstdFlags) + // Print an empty line as separator + _, err = loggerFile.WriteString("------ " + time.Now().Format(time.UnixDate) + " ------\n") + + return nil +} + func Init() { logger.Println("Initializing ESVM...") @@ -152,6 +167,7 @@ func Init() { ServiceRunPath: "", restartCount: 0, stopChannel: make(chan bool), + LogOutput: true, } if err := yaml.Unmarshal(bytes, &service); err != nil { logger.Printf("Could not read service file at %s!\n", path.Join(serviceConfigDir, "services", entry.Name())) @@ -332,6 +348,26 @@ func (service *EnitService) setCurrentState(state EnitServiceState) error { return nil } +func (service *EnitService) GetLogFile() (file *os.File, err error) { + err = os.MkdirAll(path.Join("/var/log/esvm/"), 0755) + if err != nil { + return nil, err + } + + file, err = os.OpenFile(path.Join("/var/log/esvm/", service.Name+".log"), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + return nil, err + } + + _, err = file.WriteString("------ " + time.Now().Format(time.UnixDate) + " ------\n") + if err != nil { + file.Close() + return nil, err + } + + return file, nil +} + func (service *EnitService) StartService() error { if service == nil { return nil @@ -342,23 +378,58 @@ func (service *EnitService) StartService() error { logger.Printf("Starting service (%s)...\n", service.Name) + // Get log file if service logs output + var logFile *os.File + if service.LogOutput { + var err error + logFile, err = service.GetLogFile() + if err != nil { + return err + } + } + cmd := exec.Command("/bin/sh", "-c", "exec "+service.StartCmd) + if logFile != nil { + cmd.Stdout = logFile + cmd.Stderr = logFile + } if err := cmd.Start(); err != nil { + // Close log file if not nil + if logFile != nil { + logFile.Close() + } + return err } err := service.setProcessID(cmd.Process.Pid) if err != nil { + // Close log file if not nil + if logFile != nil { + logFile.Close() + } + return err } err = service.setCurrentState(EnitServiceRunning) if err != nil { + // Close log file if not nil + if logFile != nil { + logFile.Close() + } + return err } go func() { err := cmd.Wait() + + // Close log file if not nil + if logFile != nil { + logFile.Close() + } + select { case <-service.stopChannel: service.restartCount = 0