diff --git a/go.mod b/go.mod index 78ef297..a239626 100644 --- a/go.mod +++ b/go.mod @@ -3,3 +3,5 @@ module github.com/shlldev/miniws go 1.24.5 require github.com/akamensky/argparse v1.4.0 + +require github.com/google/uuid v1.6.0 // indirect diff --git a/go.sum b/go.sum index 5bf91e2..5d2e4af 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,4 @@ github.com/akamensky/argparse v1.4.0 h1:YGzvsTqCvbEZhL8zZu2AiA5nq805NZh75JNj4ajn1xc= github.com/akamensky/argparse v1.4.0/go.mod h1:S5kwC7IuDcEr5VeXtGPRVZ5o/FdhcMlQz4IZQuw64xA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= diff --git a/main.go b/main.go index 9797543..172eb4e 100644 --- a/main.go +++ b/main.go @@ -13,6 +13,7 @@ const ( HELP_LOGFOLDER string = "the logs folder" HELP_CONFIGFOLDER string = "the configurations folder" HELP_WWWFOLDER string = "the www folder where miniws will look for files to serve" + HELP_MAXLOGBYTES string = "the maximum bytes after which the log files get split" ) func main() { @@ -22,6 +23,7 @@ func main() { logFolder := parser.String("l", "logs-folder", &argparse.Options{Default: "logs", Help: HELP_LOGFOLDER}) configFolder := parser.String("c", "config-folder", &argparse.Options{Default: "config", Help: HELP_CONFIGFOLDER}) wwwFolder := parser.String("w", "www-folder", &argparse.Options{Default: ".", Help: HELP_WWWFOLDER}) + maxLogBytes := parser.Int("b", "max-log-bytes", &argparse.Options{Default: 1024, Help: HELP_WWWFOLDER}) err := parser.Parse(os.Args) if err != nil { @@ -31,6 +33,6 @@ func main() { return } - webserver := miniws.NewWebServer(*port, *logFolder, *configFolder, *wwwFolder) + webserver := miniws.NewWebServer(*port, *logFolder, *configFolder, *wwwFolder, int64(*maxLogBytes)) webserver.Run() } diff --git a/miniws/logger.go b/miniws/logger.go index b161fee..4c5dca3 100644 --- a/miniws/logger.go +++ b/miniws/logger.go @@ -4,6 +4,8 @@ import ( "fmt" "log" "os" + + "github.com/google/uuid" ) const ( @@ -15,12 +17,14 @@ const ( ) type Logger struct { - logFolder string + logFolder string + maxLogBytes int64 } -func NewLogger(logFolder_ string) *Logger { +func NewLogger(logFolder_ string, maxLogBytes_ int64) *Logger { return &Logger{ - logFolder: logFolder_, + logFolder: logFolder_, + maxLogBytes: maxLogBytes_, } } @@ -41,22 +45,34 @@ func (l *Logger) logAccess( remoteAddr, identifier, authuser, timestamp, request, status, bytesSent, referer, user_agent, ) os.Mkdir(l.logFolder, os.ModeDir|os.ModePerm) - file, err := os.OpenFile(ensureSlashSuffix(l.logFolder)+FILENAME_ACCESSLOG, FLAGS_LOG_OPEN, PERMS_LOG_OPEN) - - if err != nil { - log.Println("couldn't open log access file at", ensureSlashSuffix(l.logFolder)+FILENAME_ACCESSLOG) - } - defer file.Close() - file.WriteString(out) + l.writeToLogFileAndRenameIfBig(FILENAME_ACCESSLOG, out) } func (l *Logger) logError(str string) { os.Mkdir(l.logFolder, PERMS_MKDIR) - file, err := os.OpenFile(ensureSlashSuffix(l.logFolder)+FILENAME_ERRORLOG, FLAGS_LOG_OPEN, PERMS_LOG_OPEN) + l.writeToLogFileAndRenameIfBig(FILENAME_ERRORLOG, str+"\n") +} + +func (l *Logger) writeToLogFileAndRenameIfBig(filename, content string) { + file, err := os.OpenFile(ensureSlashSuffix(l.logFolder)+filename, FLAGS_LOG_OPEN, PERMS_LOG_OPEN) if err != nil { - log.Println("couldn't open log error file at", ensureSlashSuffix(l.logFolder)+FILENAME_ERRORLOG) + log.Println("couldn't open log access file at", ensureSlashSuffix(l.logFolder)+filename) } + defer file.Close() - file.WriteString(str + "\n") + file.WriteString(content) + + fileinfo, err := file.Stat() + + if err != nil { + log.Println("Error reading access file at", ensureSlashSuffix(l.logFolder)+filename) + } + + if fileinfo.Size() > l.maxLogBytes { + defer os.Rename(ensureSlashSuffix( + l.logFolder)+fileinfo.Name(), + ensureSlashSuffix(l.logFolder)+fileinfo.Name()+"."+uuid.NewString(), + ) + } } diff --git a/miniws/webserver.go b/miniws/webserver.go index 7edda33..4622eaa 100644 --- a/miniws/webserver.go +++ b/miniws/webserver.go @@ -31,10 +31,10 @@ type WebServer struct { userAgentFilterMode FilterMode } -func NewWebServer(port_ int, logFolder_, configFolder_, wwwFolder_ string) *WebServer { +func NewWebServer(port_ int, logFolder_, configFolder_, wwwFolder_ string, maxLogBytes_ int64) *WebServer { return &WebServer{ - logger: NewLogger(logFolder_), + logger: NewLogger(logFolder_, maxLogBytes_), port: port_, configFolder: configFolder_, wwwFolder: wwwFolder_,