From 824f3b63ca933418249466e429037253e8adb02f Mon Sep 17 00:00:00 2001 From: wwt Date: Sun, 24 Dec 2023 11:14:46 +0800 Subject: [PATCH] typo --- http/log_writer.go | 99 +++++++++++++++++++++++++++++++++++++ http/request_log.go | 110 ++++-------------------------------------- http/syslog_writer.go | 50 +++++++++++++++++++ 3 files changed, 159 insertions(+), 100 deletions(-) create mode 100644 http/log_writer.go create mode 100644 http/syslog_writer.go diff --git a/http/log_writer.go b/http/log_writer.go new file mode 100644 index 00000000..65d68d64 --- /dev/null +++ b/http/log_writer.go @@ -0,0 +1,99 @@ +package http + +import ( + "log" + "os" + "path/filepath" + "strings" +) + +const ( + LOG_TYPE_SYSTEM = "system" + LOG_TYPE_FILE = "file" + LOG_TYPE_SYSLOG_UDP = "syslog-udp" + LOG_TYPE_SYSLOG_TCP = "syslog-tcp" +) + +type LogWriter struct { + Type string + Uri string + syslogWriter *SyslogWriter + fileWriter *os.File +} + +func (w *LogWriter) Connect() bool { + if w.Type == LOG_TYPE_SYSTEM { + return true + } + if w.Type == LOG_TYPE_FILE && w.fileWriter != nil { + return true + } + if (w.Type == LOG_TYPE_SYSLOG_TCP || w.Type == LOG_TYPE_SYSLOG_UDP) && w.syslogWriter != nil { + return true + } + if w.Type == LOG_TYPE_FILE { + w.fileWriter = _openFile(w.Uri) + } else if w.Type == LOG_TYPE_SYSLOG_UDP { + w.syslogWriter = MakeSyslogWriter("udp", w.Uri) + } else if w.Type == LOG_TYPE_SYSLOG_TCP { + w.syslogWriter = MakeSyslogWriter("tcp", w.Uri) + } + return w.syslogWriter != nil || w.fileWriter != nil +} + +func _openFile(path string) *os.File { + d := filepath.Dir(path) + err := os.MkdirAll(d, 0644) + if err != nil { + log.Println("ERROR: fail to create dir " + d) + return nil + } + file, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + log.Println("ERROR: fail to open file " + path) + log.Println(err) + return nil + } + return file +} + +func (w *LogWriter) Write(msg string) { + if w.Type == LOG_TYPE_SYSTEM { + log.Println(msg) + } else if w.Type == LOG_TYPE_FILE { + if w.Connect() { + w.fileWriter.Write([]byte(msg + "\n")) + } + } else if w.Type == LOG_TYPE_SYSLOG_TCP || w.Type == LOG_TYPE_SYSLOG_UDP { + if w.Connect() { + w.syslogWriter.Write(msg) + } + } else { + log.Println("Unsupported request log output type " + w.Type) + } +} + +func MakeLogWriter(output string) *LogWriter { + if output == LOG_TYPE_SYSTEM { + return &LogWriter{Type: LOG_TYPE_SYSTEM} + } else if strings.HasPrefix(output, "udp://") { + return &LogWriter{Type: LOG_TYPE_SYSLOG_UDP, Uri: output[6:]} + } else if strings.HasPrefix(output, "tcp://") { + return &LogWriter{Type: LOG_TYPE_SYSLOG_TCP, Uri: output[6:]} + } else if strings.HasPrefix(output, "file://") { + return &LogWriter{Type: LOG_TYPE_FILE, Uri: output[7:]} + } + log.Fatal("Unsupported log output: " + output) + return &LogWriter{} +} + +func (w *LogWriter) Close() { + if w.fileWriter != nil { + w.fileWriter.Close() + w.fileWriter = nil + } + if w.syslogWriter != nil { + w.syslogWriter.Close() + w.syslogWriter = nil + } +} diff --git a/http/request_log.go b/http/request_log.go index 885a8292..c4adeb10 100644 --- a/http/request_log.go +++ b/http/request_log.go @@ -2,13 +2,10 @@ package http import ( "fmt" - "log" - "log/syslog" "net/http" - "os" - "path/filepath" "strconv" "strings" + "sync" "time" "github.com/filebrowser/filebrowser/v2/settings" @@ -16,76 +13,14 @@ import ( "github.com/tomasen/realip" ) -type LogWriter struct { - Type string - Uri string - syslogWriter *syslog.Writer - fileWriter *os.File -} - +var mutex sync.Mutex var globalLogWriter *LogWriter = nil -func _syslogConnect(type_ string, host string) *syslog.Writer { - writer, err := syslog.Dial(type_, host, syslog.LOG_EMERG|syslog.LOG_SYSLOG, "filebrowser") - if err != nil { - log.Printf("ERROR: fail to connect to the syslog-%s server: %s", type_, host) - log.Println(err) - return nil - } else { - return writer - } -} - -func (w *LogWriter) Connect() bool { - if w.Type == "system" { - return true - } - if w.Type == "file" && w.fileWriter != nil { - return true - } - if (w.Type == "syslog-tcp" || w.Type == "syslog-udp") && w.syslogWriter != nil { - return true - } - if w.Type == "file" { - w.fileWriter = _openFile(w.Uri) - } else if w.Type == "syslog-udp" { - w.syslogWriter = _syslogConnect("udp", w.Uri) - } else if w.Type == "syslog-tcp" { - w.syslogWriter = _syslogConnect("tcp", w.Uri) - } - return w.syslogWriter != nil || w.fileWriter != nil -} - -func _openFile(path string) *os.File { - d := filepath.Dir(path) - err := os.MkdirAll(d, 0644) - if err != nil { - log.Println("ERROR: fail to create dir " + d) - return nil - } - file, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644) - if err != nil { - log.Println("ERROR: fail to open file " + path) - log.Println(err) - return nil - } - return file -} - -func (w *LogWriter) Write(msg string) { - if w.Type == "system" { - log.Println(msg) - } else if w.Type == "file" { - if w.Connect() { - w.fileWriter.Write([]byte(msg + "\n")) - } - } else if w.Type == "syslog-udp" || w.Type == "syslog-tcp" { - if w.Connect() { - w.syslogWriter.Emerg(msg) - } - } else { - log.Println("Unsupported request log output type " + w.Type) +func _globalLogWriter(output string) *LogWriter { + if globalLogWriter == nil { + globalLogWriter = MakeLogWriter(output) } + return globalLogWriter } type RequestLog struct { @@ -190,34 +125,6 @@ func (h *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { h.f(w, r) } -func _logToOutput(msg string, writer *LogWriter) { - if writer != nil { - writer.Write(msg) - } -} - -func _getLogWriter(output string) *LogWriter { - if output == "system" { - return &LogWriter{Type: "system"} - } else if strings.HasPrefix(output, "udp://") { - return &LogWriter{Type: "syslog-udp", Uri: output[6:]} - } else if strings.HasPrefix(output, "tcp://") { - return &LogWriter{Type: "syslog-tcp", Uri: output[6:]} - } else if strings.HasPrefix(output, "file://") { - return &LogWriter{Type: "file", Uri: output[7:]} - } - log.Fatal("Unsupported log output: " + output) - return &LogWriter{} -} - -func _globalLogWriter(output string) *LogWriter { - if globalLogWriter == nil { - globalLogWriter = _getLogWriter(output) - } - return globalLogWriter - -} - func _log(writer *ResponseWriterWrapper, r *http.Request, user *users.User, server *settings.Server) { log_ := RequestLog{ user: user, @@ -235,7 +142,10 @@ func _log(writer *ResponseWriterWrapper, r *http.Request, user *users.User, serv if log_.status == 0 { log_.status = 200 } - _globalLogWriter(server.RequestLogOutput).Write(formatLog(server.RequestLogFormat, log_)) + msg := formatLog(server.RequestLogFormat, log_) + mutex.Lock() + defer mutex.Unlock() + _globalLogWriter(server.RequestLogOutput).Write(msg) } func RequestLogHandlerFunc(handler http.HandlerFunc, server *settings.Server) http.HandlerFunc { diff --git a/http/syslog_writer.go b/http/syslog_writer.go new file mode 100644 index 00000000..79f5dfd4 --- /dev/null +++ b/http/syslog_writer.go @@ -0,0 +1,50 @@ +package http + +import ( + "log" + "log/syslog" +) + +type SyslogWriter struct { + Type string + Host string + Writer *syslog.Writer +} + +func MakeSyslogWriter(type_ string, host string) *SyslogWriter { + return &SyslogWriter{ + Type: type_, + Host: host, + Writer: nil, + } +} + +func (w *SyslogWriter) Write(msg string) { + if w.Writer == nil { + w.Writer = syslogConnect(w.Type, w.Host) + } + if w.Writer != nil { + err := w.Writer.Emerg(msg) + if err != nil { + log.Println("ERROR: fail to write syslog") + } + } +} + +func syslogConnect(type_ string, host string) *syslog.Writer { + writer, err := syslog.Dial(type_, host, syslog.LOG_EMERG|syslog.LOG_KERN, "filebrowser") + if err != nil { + log.Printf("ERROR: fail to connect to the syslog-%s server: %s", type_, host) + log.Println(err) + return nil + } else { + return writer + } +} + +func (w *SyslogWriter) Close() { + if w.Writer != nil { + w.Writer.Close() + w.Writer = nil + } +}