Skip to content

Commit

Permalink
more logging
Browse files Browse the repository at this point in the history
  • Loading branch information
matronator committed Apr 2, 2024
1 parent 030afaf commit 6a4ee62
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 16 deletions.
7 changes: 4 additions & 3 deletions database.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ func GenerateEntity(entity EntityJSON, table *Table) (Entity, *Table) {

func HydrateDatabase(db Database) Database {
now := time.Now()
Debug("Building database...")

var entityJSON EntityJSON

Expand All @@ -33,7 +34,7 @@ func HydrateDatabase(db Database) Database {
}

elapsed := time.Since(now).String()
fmt.Println(gchalk.Italic("Database is ready! " + gchalk.Dim("("+elapsed+")")))
Debug("Database is ready! " + gchalk.Italic("("+elapsed+")"))

return db
}
Expand All @@ -44,7 +45,7 @@ func CreateTable(table *Table, entityJSON EntityJSON) Table {

if _, err := os.Stat(dir); !errors.Is(err, os.ErrNotExist) {
table.File = dir
fmt.Println(gchalk.Dim("Table", gchalk.Bold(table.Name), "found at", gchalk.Italic(dir), "- skipping..."))
Debug("Table "+gchalk.Bold(table.Name)+" found at "+gchalk.Italic(dir)+" - skipping...", "table", table.Name, "file", dir)

return *table
}
Expand Down Expand Up @@ -72,7 +73,7 @@ func CreateTable(table *Table, entityJSON EntityJSON) Table {

table.File = dir

fmt.Println(gchalk.Dim("Table", gchalk.Bold(table.Name), "created at", gchalk.Italic(dir), "from file", gchalk.Bold(table.Definition)))
Debug("Table "+gchalk.Bold(table.Name)+" created at "+gchalk.Italic(dir)+" from file "+gchalk.Bold(table.Definition), "table", table.Name, "file", dir, "schema", table.Definition)

return *table
}
Expand Down
72 changes: 67 additions & 5 deletions logger.go
Original file line number Diff line number Diff line change
@@ -1,28 +1,73 @@
package main

import (
"flag"
"log"
"log/slog"
"net/http"
"strconv"
"time"

"github.com/jwalton/gchalk"
)

func LogRequest(handler http.Handler) http.Handler {
type StatusRecorder struct {
http.ResponseWriter
Status int
}

func (sr *StatusRecorder) WriteHeader(status int) {
sr.Status = status
sr.ResponseWriter.WriteHeader(status)
}

var LogLevel = new(slog.LevelVar)

func Warn(msg string, args ...any) {
slog.Warn(gchalk.Yellow(msg), args...)
}

func Error(msg string, args ...any) {
slog.Error(gchalk.Red(msg), args...)
}

func Debug(msg string, args ...any) {
slog.Debug(gchalk.Dim(msg), args...)
}

var Verbose = false
var verboseFlag = flag.Bool("verbose", false, "Enable verbose logging")

func InitLogger() {
flag.BoolVar(verboseFlag, "v", false, "Shorthand for `--verbose`")
flag.Parse()
Verbose = *verboseFlag

if Verbose {
LogLevel.Set(slog.LevelDebug)
slog.SetLogLoggerLevel(LogLevel.Level())
}
}

func LogRequest(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()

log.SetFlags(log.Ldate | log.Ltime)
log.SetPrefix("[amock]: ")

remoteAddr := gchalk.Bold(r.RemoteAddr)
method := requestMethodColor(r.Method)
start := time.Now()
recorder := &StatusRecorder{w, http.StatusOK}

handler.ServeHTTP(w, r)
next.ServeHTTP(recorder, r)

elapsed := time.Since(start).String()
elapsed = gchalk.WithItalic().Dim("(" + elapsed + ")")
status := getStatusColor(recorder.Status)

// [amock]: 2024/04/01 02:43:10 - localhost:8000 | 127.0.0.1:12345 -> GET /api/v1/users (1.234s)
log.Printf("- %s | %s -> %s %s %s", r.Host, remoteAddr, method, r.URL, elapsed)
// [amock]: 2024/04/01 02:43:10 - localhost:8000 | 127.0.0.1:12345 -> GET /api/v1/users - 200 OK (1.234s)
log.Printf("- %s | %s -> %s %s - %s %s", r.Host, remoteAddr, method, r.URL, status, elapsed)
})
}

Expand All @@ -48,3 +93,20 @@ func requestMethodColor(m string) string {
}
return method
}

func getStatusColor(status int) string {
var color string
switch {
case status >= 200 && status < 300:
color = gchalk.BrightGreen(gchalk.Bold(strconv.Itoa(status)), http.StatusText(status))
case status >= 300 && status < 400:
color = gchalk.BrightBlue(gchalk.Bold(strconv.Itoa(status)), http.StatusText(status))
case status >= 400 && status < 500:
color = gchalk.BrightYellow(gchalk.Bold(strconv.Itoa(status)), http.StatusText(status))
case status >= 500:
color = gchalk.BrightRed(gchalk.Bold(strconv.Itoa(status)), http.StatusText(status))
default:
color = gchalk.Bold(strconv.Itoa(status)) + http.StatusText(status)
}
return color
}
28 changes: 22 additions & 6 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"strings"

"github.com/ilyakaznacheev/cleanenv"
"github.com/jwalton/gchalk"
)

var ConfigPaths = []string{
Expand All @@ -33,6 +34,13 @@ type Database struct {
Tables map[string]Table
}

type Route struct {
Method string
Path string
}

var Routes []Route

type Table struct {
Name string
File string
Expand All @@ -58,8 +66,9 @@ var config *Config

var db Database

func Init() {
fmt.Println("Creating database from config...")
func init() {
InitLogger()
Debug("Creating database from config...")

config, _ = ParseConfigFiles(ConfigPaths...)

Expand Down Expand Up @@ -112,21 +121,28 @@ func Init() {
}
}

Debug("Database created")

db = HydrateDatabase(db)
}

func main() {
Init()
router := InitHandlers(config, db)

var url string
if strings.Contains(config.Host, "http://") || strings.Contains(config.Host, "https://") {
url = config.Host + ":" + strconv.Itoa(config.Port)
} else {
url = "http://" + config.Host + ":" + strconv.Itoa(config.Port)
}

fmt.Println("\nStarting server at " + url)
fmt.Println(gchalk.Bold("Starting server at " + url))
fmt.Println("\nAvailable routes:")

router := InitHandlers(config, db)
for _, route := range Routes {
fmt.Println(" " + gchalk.Italic(route.Method) + " " + url + route.Path)
}
fmt.Println("")

log.Fatal(http.ListenAndServe(config.Host+":"+strconv.Itoa(config.Port), LogRequest(router)))
}

Expand Down
4 changes: 4 additions & 0 deletions post-user.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
### GET request to example server
PUT localhost:8000/user

###
7 changes: 5 additions & 2 deletions server.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package main

import (
"fmt"
"net/http"

"github.com/julienschmidt/httprouter"
)

func InitHandlers(config *Config, db Database) *httprouter.Router {
fmt.Println("Initializing handlers...")
Debug("Initializing handlers...")
router := httprouter.New()

for _, table := range db.Tables {
Routes = append(Routes, Route{"GET", "/" + table.Name})
router.GET("/"+table.Name, func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
content, err := GetTable(&table)

Expand All @@ -25,10 +25,13 @@ func InitHandlers(config *Config, db Database) *httprouter.Router {
_, _ = w.Write(content)
})

Routes = append(Routes, Route{"POST", "/" + table.Name})
router.POST("/"+table.Name, func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
// var body []byte
})
}

Debug("Handlers initialized")

return router
}

0 comments on commit 6a4ee62

Please sign in to comment.