diff --git a/cmd/server/main.go b/cmd/server/main.go index 93f3aa6..03996dd 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -12,13 +12,15 @@ import ( ) func main() { - logger.Init() - setup, err := utils.ParseSetupFile() if err != nil { - logger.Critical(err) + fmt.Fprintf(os.Stderr, "ERROR: Cannot read %s: %v\n", utils.CONF, err) + os.Exit(1) } + logger.Init(setup.LogFile) + defer logger.Close() + if setup.Socket == "" { setup.Socket = fmt.Sprintf("/tmp/taskmasterd-%d.sock", os.Getpid()) } diff --git a/internal/logger/logger.go b/internal/logger/logger.go index 392e3d7..80c8e66 100644 --- a/internal/logger/logger.go +++ b/internal/logger/logger.go @@ -4,6 +4,7 @@ import ( "fmt" "log/syslog" "os" + "path/filepath" "strings" "sync" "time" @@ -40,11 +41,12 @@ type Logger struct { level LogLevel mutex sync.Mutex syslogger *syslog.Writer + file *os.File } var logger Logger -func Init() { +func Init(logfile string) { syslogger, err := syslog.New(syslog.LOG_INFO, "taskmaster") if err != nil { @@ -61,9 +63,38 @@ func Init() { level = lvl } + var file *os.File + + if logfile != "" { + if dir := filepath.Dir(logfile); dir != "." { + if err := os.Mkdir(dir, 0755); err != nil { + fmt.Fprintf(os.Stderr, "ERROR: CAnnot create logfile directory %q: %v\n", dir, err) + os.Exit(1) + } + } + + file, err = os.OpenFile(logfile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) + + if err != nil { + fmt.Fprintf(os.Stderr, "ERROR: Cannot open logfile %q: %v\n", logfile, err) + os.Exit(1) + } + } + logger = Logger{ level: level, syslogger: syslogger, + file: file, + } +} + +func Close() { + logger.mutex.Lock() + defer logger.mutex.Unlock() + + if logger.file != nil { + logger.file.Close() + logger.file = nil } } @@ -170,4 +201,8 @@ func (l *Logger) log(level LogLevel, a any) { defer l.mutex.Unlock() fmt.Println(message) + + if l.file != nil { + fmt.Fprintln(l.file, message) + } } diff --git a/internal/utils/setup.go b/internal/utils/setup.go index 592d9cf..cc2e38a 100644 --- a/internal/utils/setup.go +++ b/internal/utils/setup.go @@ -1,18 +1,19 @@ package utils import ( + "os/user" "strconv" "syscall" - "os/user" "github.com/Archer-01/taskmaster/internal/parser/config" "github.com/BurntSushi/toml" ) type Setup struct { - Prompt string `toml:"prompt"` - Socket string `toml:"socket"` - Config string `toml:"config" validate:"default=taskmaster.toml"` + Prompt string `toml:"prompt"` + Socket string `toml:"socket"` + Config string `toml:"config" validate:"default=taskmaster.toml"` + LogFile string `toml:"logfile"` } const ( diff --git a/setup.toml b/setup.toml index 39a7136..10225ec 100644 --- a/setup.toml +++ b/setup.toml @@ -1 +1,2 @@ prompt = "taskmaster> " +logfile = "/log/taskmaster.log"