Improve logging, migrate to zap, use requestID
- migrate from log to go.uber.org/zap package - add requestID header with sticky log field - push logging via context to REST controllers & HTTP middleware - enhance request/resnpose logging - add service logging framework - add ZapProfiler for db query profiling
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
||||
"github.com/titpetric/factory/resputil"
|
||||
|
||||
"github.com/crusttech/crust/{project}/rest/request"
|
||||
"github.com/crusttech/crust/internal/logger"
|
||||
)
|
||||
|
||||
// Internal API interface
|
||||
@@ -34,13 +35,16 @@ func New{name|expose}({self}h {name|expose}API) *{name|expose} {
|
||||
defer r.Body.Close()
|
||||
params := request.New{name|capitalize}{call.name|capitalize}()
|
||||
if err := params.Fill(r); err != nil {
|
||||
logger.LogParamError("{name|expose}.{call.name|capitalize}", r, err, params)
|
||||
resputil.JSON(w, err)
|
||||
return
|
||||
}
|
||||
if value, err := {self}h.{call.name|capitalize}(r.Context(), params); err != nil {
|
||||
logger.LogControllerError("{name|expose}.{call.name|capitalize}", r, err, params)
|
||||
resputil.JSON(w, err)
|
||||
return
|
||||
} else {
|
||||
logger.LogControllerCall("{name|expose}.{call.name|capitalize}", r, params)
|
||||
switch fn := value.(type) {
|
||||
case func(http.ResponseWriter, *http.Request):
|
||||
fn(w, r)
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"encoding/json"
|
||||
"go/format"
|
||||
"io/ioutil"
|
||||
|
||||
"github.com/crusttech/crust/internal/rules"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var (
|
||||
pkg = flag.String("package", "main", "Package name")
|
||||
input = flag.String("input", "", "Input .json filename")
|
||||
output = flag.String("output", "", "Output .go filename")
|
||||
objectName = flag.String("object-name", "c Permissions() []rules.OperationGroup", "Default function declaration")
|
||||
)
|
||||
flag.Parse()
|
||||
|
||||
var (
|
||||
fnPermissions = fmt.Sprintf("func (*%s) Permissions() []rules.OperationGroup", *objectName)
|
||||
fnPermissionDefault = fmt.Sprintf("func (*%s) PermissionDefault(key string) rules.Access", *objectName)
|
||||
)
|
||||
|
||||
export := func(s string, values string) []byte {
|
||||
formatCode := func(s string) string {
|
||||
s = strings.Replace(s, "true,", "true,\n", -1)
|
||||
s = strings.Replace(s, "false,", "false,\n", -1)
|
||||
s = strings.Replace(s, "{", "{\n", -1)
|
||||
s = strings.Replace(s, "}", ",\n}", -1)
|
||||
s = strings.Replace(s, "\", ", "\",\n", -1)
|
||||
|
||||
s = strings.Replace(s, "Default:2,", "Default: rules.Allow,", -1)
|
||||
s = strings.Replace(s, "Default:1,", "Default: rules.Deny,", -1)
|
||||
s = strings.Replace(s, "Default:0,", "Default: rules.Inherit,", -1)
|
||||
return s
|
||||
}
|
||||
|
||||
formatDefaults := func(s string) string {
|
||||
s = formatCode(s)
|
||||
s = strings.Replace(s, ", ", ",\n", -1)
|
||||
s = strings.Replace(s, ":2,", ": rules.Allow,", -1)
|
||||
s = strings.Replace(s, ":1,", ": rules.Deny,", -1)
|
||||
s = strings.Replace(s, ":0,", ": rules.Inherit,", -1)
|
||||
return s
|
||||
}
|
||||
|
||||
s = formatCode(s)
|
||||
values = formatDefaults(values)
|
||||
|
||||
var w bytes.Buffer
|
||||
|
||||
fmt.Fprintln(&w, "package", *pkg)
|
||||
fmt.Fprintln(&w)
|
||||
fmt.Fprintln(&w, "import \"github.com/crusttech/crust/internal/rules\"")
|
||||
fmt.Fprintln(&w)
|
||||
fmt.Fprintln(&w, "/* File is generated from", *input, "with permissions.go */")
|
||||
fmt.Fprintln(&w)
|
||||
fmt.Fprintln(&w, fnPermissions, "{")
|
||||
fmt.Fprintln(&w, "\treturn", s)
|
||||
fmt.Fprintln(&w, "}")
|
||||
fmt.Fprintln(&w)
|
||||
fmt.Fprintln(&w, fnPermissionDefault, "{")
|
||||
fmt.Fprintln(&w, "\tvalues := ", values)
|
||||
fmt.Fprintln(&w, "\tif value, ok := values[key]; ok {")
|
||||
fmt.Fprintln(&w, "\t\treturn value")
|
||||
fmt.Fprintln(&w, "\t}")
|
||||
fmt.Fprintln(&w, "\treturn rules.Inherit")
|
||||
fmt.Fprintln(&w, "}")
|
||||
|
||||
fmtsrc, err := format.Source(w.Bytes())
|
||||
if err != nil {
|
||||
log.Printf("fmt warn: %v\n", err)
|
||||
fmtsrc = w.Bytes()
|
||||
}
|
||||
|
||||
return fmtsrc
|
||||
}
|
||||
|
||||
var result []rules.OperationGroup
|
||||
|
||||
f, err := os.Open(*input)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if err := json.NewDecoder(f).Decode(&result); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// fill default values from groups
|
||||
values := make(map[string]rules.Access)
|
||||
for _, group := range result {
|
||||
for _, row := range group.Operations {
|
||||
values[row.Key] = row.Default
|
||||
}
|
||||
}
|
||||
|
||||
source := export(fmt.Sprintf("%#v", result), fmt.Sprintf("%#v", values))
|
||||
if err := ioutil.WriteFile(*output, source, 0644); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Println(*output)
|
||||
}
|
||||
Reference in New Issue
Block a user