From cc8c12e24d10d0943a0bbd4b5c8967e91b6be084 Mon Sep 17 00:00:00 2001 From: Amy Gale Ruth Bowersox Date: Sun, 14 Sep 2025 16:10:29 -0600 Subject: [PATCH] refactoring and introduction of logrus logging --- go.mod | 2 ++ go.sum | 9 +++++++++ logging.go | 39 +++++++++++++++++++++++++++++++++++++++ server.go | 11 +++++++++++ ui/images.go | 7 +++++-- 5 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 logging.go diff --git a/go.mod b/go.mod index 63fba3f..0d46fc6 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module git.erbosoft.com/amy/amsterdam go 1.25.0 require ( + github.com/sirupsen/logrus v1.9.3 github.com/CloudyKit/jet/v6 v6.3.1 github.com/labstack/echo/v4 v4.13.4 gopkg.in/yaml.v3 v3.0.1 @@ -19,4 +20,5 @@ require ( golang.org/x/net v0.40.0 // indirect golang.org/x/sys v0.33.0 // indirect golang.org/x/text v0.25.0 // indirect + golang.org/x/time v0.11.0 // indirect ) diff --git a/go.sum b/go.sum index 9a966fc..c6c3600 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,7 @@ github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4s github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v6 v6.3.1 h1:6IAo5Cx21xrHVaR8zzXN5gJatKV/wO7Nf6bfCnCSbUw= github.com/CloudyKit/jet/v6 v6.3.1/go.mod h1:lf8ksdNsxZt7/yH/3n4vJQWA9RUq4wpaHtArHhGVMOw= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/labstack/echo/v4 v4.13.4 h1:oTZZW+T3s9gAu5L8vmzihV7/lkXGZuITzTQkTEhcXEA= @@ -14,6 +15,10 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -24,12 +29,16 @@ golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= 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.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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/logging.go b/logging.go new file mode 100644 index 0000000..e179a9e --- /dev/null +++ b/logging.go @@ -0,0 +1,39 @@ +/* + * Amsterdam Web Communities System + * Copyright (c) 2025 Erbosoft Metaverse Design Solutions, All Rights Reserved + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ +package main + +import ( + "time" + + "github.com/labstack/echo/v4" + log "github.com/sirupsen/logrus" +) + +// Custom Logrus middleware +func LogrusMiddleware(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + start := time.Now() + err := next(c) + stop := time.Now() + + req := c.Request() + res := c.Response() + + log.WithFields(log.Fields{ + "remote_ip": c.RealIP(), + "host": req.Host, + "method": req.Method, + "uri": req.RequestURI, + "status": res.Status, + "latency_ms": stop.Sub(start).Milliseconds(), + "user_agent": req.UserAgent(), + }).Info("handled request") + return err + } +} diff --git a/server.go b/server.go index a7a45f3..c02b00d 100644 --- a/server.go +++ b/server.go @@ -11,10 +11,14 @@ package main import ( "git.erbosoft.com/amy/amsterdam/ui" "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" + log "github.com/sirupsen/logrus" ) func setupEcho() *echo.Echo { e := echo.New() + e.Use(middleware.Recover()) + e.Use(LogrusMiddleware) e.Renderer = &ui.TemplateRenderer{} e.GET("/img/*", ui.AmWrap(ui.AmServeImage)) e.GET("/", ui.AmWrap(func(ctxt ui.AmContext) (string, any, error) { @@ -25,6 +29,13 @@ func setupEcho() *echo.Echo { } func main() { + log.SetFormatter(&log.TextFormatter{ + FullTimestamp: true, + TimestampFormat: "2006-01-02 15:04:05", + }) + log.SetLevel(log.InfoLevel) + e := setupEcho() + e.Logger.Fatal(e.Start(":1323")) } diff --git a/ui/images.go b/ui/images.go index 312e08d..12ba134 100644 --- a/ui/images.go +++ b/ui/images.go @@ -19,6 +19,10 @@ import ( //go:embed static_images/* var static_images embed.FS +func mimeTypeFromFilename(filename string) string { + return mime.TypeByExtension(filename[strings.LastIndex(filename, "."):]) +} + func AmServeImage(ctxt AmContext) (string, any, error) { components := strings.SplitAfter(ctxt.URLPath(), "/") var err error = nil @@ -26,8 +30,7 @@ func AmServeImage(ctxt AmContext) (string, any, error) { var b []byte b, err = static_images.ReadFile(fmt.Sprintf("static_images/%s", components[3])) if err == nil { - mtype := mime.TypeByExtension(components[3][strings.LastIndex(components[3], "."):]) - ctxt.SetOutputType(mtype) + ctxt.SetOutputType(mimeTypeFromFilename(components[3])) return "bytes", b, nil } }