cherry-pick caller logprint fix from psycho-backend

This commit is contained in:
Mike Schwörer 2023-01-13 17:51:55 +01:00
parent e737cd9d5c
commit acd7de0dee
Signed by: Mikescher
GPG Key ID: D3C7172E0A70F8CF
2 changed files with 63 additions and 7 deletions

View File

@ -6,7 +6,7 @@
#### BEFORE RELEASE #### BEFORE RELEASE
- tests (!) - finish tests (!)
- migration script for existing data - migration script for existing data
@ -18,16 +18,21 @@
- diff my currently used scnsend script vs the one in the docs here - diff my currently used scnsend script vs the one in the docs here
- (?) use str-ids (also prevents wrong-joins) -> see psycho - (?) use str-ids (hide counts and prevents wrong-joins) -> see psycho
-> how does it work with existing data? (do i care, there are only 2 active users... (are there?)) -> ensre that all queries that return multiple are properly ordered
-> how does it work with existing data?
-> do i care, there are only 2 active users... (are there?)
- error logging as goroutine, gets all errors via channel, - error logging as goroutine, gets all errors via channel,
(channel buffered - nonblocking send, second channel that gets a message when sender failed ) (channel buffered - nonblocking send, second channel that gets a message when sender failed )
(then all errors end up in _second_ sqlite table) (then all errors end up in _second_ sqlite table)
due to message channel etc everything is non blocking and cant fail in main due to message channel etc everything is non blocking and cant fail in main
- request logging (log all requests with body response, exitcode, headers, uri, route, userid, ..., tx-retries, etc), (trim body/response if too big?) - => implement proper error logging in goext, kinda combines zerolog and wrapped-errors
copy basic code from bringman, but remove all bm specific stuff and make it abstract
Register(ErrType) methods, errtypes then as structs
log.xxx package with same interface as zerolog
- jobs to clear requests-db and logs-db after to only keep X entries... - jobs to clear requests-db and logs-db after to only keep X entries...
-> logs and request-logging into their own sqlite files (sqlite-files are prepped) -> logs and request-logging into their own sqlite files (sqlite-files are prepped)

View File

@ -1,16 +1,32 @@
package server package server
import ( import (
"fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"os" "os"
"path"
"path/filepath"
"runtime"
) )
var callerRoot = ""
func init() {
_, file, _, ok := runtime.Caller(0)
if !ok {
return
}
callerRoot = path.Dir(file)
}
func Init(cfg Config) { func Init(cfg Config) {
cw := zerolog.ConsoleWriter{ cw := zerolog.ConsoleWriter{
Out: os.Stdout, Out: os.Stdout,
TimeFormat: "2006-01-02 15:04:05 Z07:00", TimeFormat: "2006-01-02 15:04:05 Z07:00",
FormatCaller: formatCaller,
} }
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
@ -32,3 +48,38 @@ func Init(cfg Config) {
log.Debug().Msg("Initialized") log.Debug().Msg("Initialized")
} }
func formatCaller(i any) string {
const (
colorBlack = iota + 30
colorRed
colorGreen
colorYellow
colorBlue
colorMagenta
colorCyan
colorWhite
colorBold = 1
colorDarkGray = 90
)
var c string
if cc, ok := i.(string); ok {
c = cc
}
if len(c) > 0 {
if rel, err := filepath.Rel(callerRoot, c); err == nil {
c = rel
}
c = colorize(c, colorBold, false) + colorize(" >", colorCyan, false)
}
return c
}
func colorize(s interface{}, c int, disabled bool) string {
if disabled {
return fmt.Sprintf("%s", s)
}
return fmt.Sprintf("\x1b[%dm%v\x1b[0m", c, s)
}