diff --git a/assets/templates/middleware/info_log.tmpl b/assets/templates/middleware/info_log.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..195caef86dc68ccf325fa8b8c61fcea95f2f3c4c --- /dev/null +++ b/assets/templates/middleware/info_log.tmpl @@ -0,0 +1,79 @@ +import ( + "fmt" + "time" + "context" + + "git.perx.ru/perxis/perxis-go/pkg/items" + logzap "git.perx.ru/perxis/perxis-go/pkg/log/zap" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +{{ $funcName := (or .Vars.FuncName ("LogMiddleware")) }} +{{ $decorator := (or .Vars.DecoratorName ("logMiddleware")) }} +{{ $packageName := (split "." .Interface.Type)._0 }} +{{ $serviceName := (split "." .Interface.Type)._1 }} +{{ $objectName := (trimSuffix "s" (split "." .Interface.Type)._1) }} +{{ $writeMethods := list "Archive" "Create" "Delete" "Publish" "Unarchive" "Undelete" "Unpublish" "Update" }} + +type {{ $decorator }} struct { + logger *zap.Logger + next {{ .Interface.Type }} +} + +func {{ $funcName }} (logger *zap.Logger) Middleware { + return func(next {{ .Interface.Type }}) {{ .Interface.Type }} { + return &{{ $decorator }}{ + next: next, + logger: logger.With(logzap.Component("{{ $serviceName }}")), + } + } +} + +{{ range $method := .Interface.Methods }} + func (m *{{ $decorator }}) {{ $method.Declaration }} { + {{- if has $method.Name $writeMethods }} + {{ $method.ResultsNames }} = m.next.{{ $method.Call }} + + {{ $inputObject := "" }} + {{ $outputObject := "" }} + + {{ if gt (len $method.Results) 1 }} + {{ $outputObject = (first $method.Results).Name }} + {{ end }} + + {{ if $method.AcceptsContext }} + {{ $inputObject = (first (rest $method.Params)).Name }} + {{ else if not $method.ReturnsError }} + {{ $inputObject = (first $method.Params).Name }} + {{ end }} + + fields := []zapcore.Field{ + logzap.Event({{ $packageName }}.Event{{ $method.Name }}{{ $objectName }}), + logzap.CallerFromContext(ctx), + {{/* {{ if eq $outputObject "" }} logzap.Object({{ $inputObject }}), {{- end }}*/}} + } + + {{ if $method.ReturnsError }} + if err != nil { + {{- if not (eq $inputObject "") }} + fields = append(fields, logzap.Object({{ $inputObject }})) + {{- end }} + m.logger.Error(fmt.Sprintf("Failed to {{ (lower $method.Name) }}. Error: %s", err), fields...) + } else { + {{- if not (eq $outputObject "") }} + fields = append(fields, logzap.Object({{ $inputObject }})) + {{- else if not (eq $inputObject "") }} + fields = append(fields, logzap.Object({{ $inputObject }})) + {{- end }} + m.logger.Info("Successfully {{ (lower (trimSuffix "e" $method.Name)) }}ed", fields...) + } + {{ end }} + + m.logger.Info("{{ $method.Name }}", fields...) + return {{ $method.ResultsNames }} + {{- else }} + return m.next.{{ $method.Call }} + {{- end }} + } +{{ end }} diff --git a/assets/templates/middleware/middleware b/assets/templates/middleware/middleware deleted file mode 100755 index 89877774c933840c2bdd569f2beed8105588aae2..0000000000000000000000000000000000000000 --- a/assets/templates/middleware/middleware +++ /dev/null @@ -1,21 +0,0 @@ -import ( - "go.uber.org/zap" -) - -type Middleware func({{.Interface.Type}}) {{.Interface.Type}} - - -func WithLog(s {{.Interface.Type}}, logger *zap.Logger, log_access bool) {{.Interface.Type}} { - if logger == nil { - logger = zap.NewNop() - } - - logger = logger.Named("{{ .Interface.Name }}") - s = ErrorLoggingMiddleware(logger)(s) - if log_access { - s = LoggingMiddleware(logger)(s) - } - s = RecoveringMiddleware(logger)(s) - return s -} - diff --git a/assets/templates/middleware/middleware.tmpl b/assets/templates/middleware/middleware.tmpl new file mode 100755 index 0000000000000000000000000000000000000000..bbbc20e55ca8a8763ae767b19b035f4ebee0dd68 --- /dev/null +++ b/assets/templates/middleware/middleware.tmpl @@ -0,0 +1,29 @@ +import ( + "go.uber.org/zap" +) + +{{ $serviceName := (split "." .Interface.Type)._1 }} + +type Middleware func({{.Interface.Type}}) {{.Interface.Type}} + +func WithLog(s {{.Interface.Type}}, logger, svcLogger *zap.Logger, log_access bool) {{.Interface.Type}} { + if logger == nil { + logger = zap.NewNop() + } + logger = logger.Named("{{ .Interface.Name }}") + + {{ if (eq $serviceName "Items") }} + if svcLogger == nil { + svcLogger = zap.NewNop() + } + s = LogInfoMiddleware(svcLogger)(s) + {{ end }} + + s = ErrorLoggingMiddleware(logger)(s) + if log_access { + s = LoggingMiddleware(logger)(s) + } + s = RecoveringMiddleware(logger)(s) + return s +} + diff --git a/pkg/items/middleware/log_service_middleware.go b/pkg/items/middleware/log_info_middleware.go similarity index 74% rename from pkg/items/middleware/log_service_middleware.go rename to pkg/items/middleware/log_info_middleware.go index 48c4125e5c3d89e4648132667f52c3920b9e489c..c80d51d49078afdfe0cf8138c34d913f9b9408ba 100644 --- a/pkg/items/middleware/log_service_middleware.go +++ b/pkg/items/middleware/log_info_middleware.go @@ -10,21 +10,21 @@ import ( "go.uber.org/zap/zapcore" ) -type logServiceMiddleware struct { +type logInfoMiddleware struct { items.Items logger *zap.Logger } -func LogServiceMiddleware(logger *zap.Logger) Middleware { +func LogInfoMiddleware(logger *zap.Logger) Middleware { return func(next items.Items) items.Items { - return &logServiceMiddleware{ + return &logInfoMiddleware{ Items: next, logger: logger.With(logzap.Component("Items")), } } } -func (m *logServiceMiddleware) Archive(ctx context.Context, item *items.Item, options ...*items.ArchiveOptions) (err error) { +func (m *logInfoMiddleware) Archive(ctx context.Context, item *items.Item, options ...*items.ArchiveOptions) (err error) { err = m.Items.Archive(ctx, item, options...) fields := []zapcore.Field{ @@ -41,7 +41,7 @@ func (m *logServiceMiddleware) Archive(ctx context.Context, item *items.Item, op return err } -func (m *logServiceMiddleware) Create(ctx context.Context, item *items.Item, opts ...*items.CreateOptions) (created *items.Item, err error) { +func (m *logInfoMiddleware) Create(ctx context.Context, item *items.Item, opts ...*items.CreateOptions) (created *items.Item, err error) { created, err = m.Items.Create(ctx, item, opts...) fields := []zapcore.Field{ @@ -58,7 +58,7 @@ func (m *logServiceMiddleware) Create(ctx context.Context, item *items.Item, opt return created, err } -func (m *logServiceMiddleware) Delete(ctx context.Context, item *items.Item, options ...*items.DeleteOptions) (err error) { +func (m *logInfoMiddleware) Delete(ctx context.Context, item *items.Item, options ...*items.DeleteOptions) (err error) { err = m.Items.Delete(ctx, item, options...) fields := []zapcore.Field{ @@ -75,7 +75,7 @@ func (m *logServiceMiddleware) Delete(ctx context.Context, item *items.Item, opt return err } -func (m *logServiceMiddleware) Publish(ctx context.Context, item *items.Item, options ...*items.PublishOptions) (err error) { +func (m *logInfoMiddleware) Publish(ctx context.Context, item *items.Item, options ...*items.PublishOptions) (err error) { err = m.Items.Publish(ctx, item, options...) fields := []zapcore.Field{ @@ -92,7 +92,7 @@ func (m *logServiceMiddleware) Publish(ctx context.Context, item *items.Item, op return err } -func (m *logServiceMiddleware) Unarchive(ctx context.Context, item *items.Item, options ...*items.UnarchiveOptions) (err error) { +func (m *logInfoMiddleware) Unarchive(ctx context.Context, item *items.Item, options ...*items.UnarchiveOptions) (err error) { err = m.Items.Unarchive(ctx, item, options...) fields := []zapcore.Field{ @@ -109,7 +109,7 @@ func (m *logServiceMiddleware) Unarchive(ctx context.Context, item *items.Item, return err } -func (m *logServiceMiddleware) Undelete(ctx context.Context, item *items.Item, options ...*items.UndeleteOptions) (err error) { +func (m *logInfoMiddleware) Undelete(ctx context.Context, item *items.Item, options ...*items.UndeleteOptions) (err error) { err = m.Items.Undelete(ctx, item, options...) fields := []zapcore.Field{ @@ -126,7 +126,7 @@ func (m *logServiceMiddleware) Undelete(ctx context.Context, item *items.Item, o return err } -func (m *logServiceMiddleware) Unpublish(ctx context.Context, item *items.Item, options ...*items.UnpublishOptions) (err error) { +func (m *logInfoMiddleware) Unpublish(ctx context.Context, item *items.Item, options ...*items.UnpublishOptions) (err error) { err = m.Items.Unpublish(ctx, item, options...) fields := []zapcore.Field{ @@ -143,7 +143,7 @@ func (m *logServiceMiddleware) Unpublish(ctx context.Context, item *items.Item, return err } -func (m *logServiceMiddleware) Update(ctx context.Context, item *items.Item, options ...*items.UpdateOptions) (err error) { +func (m *logInfoMiddleware) Update(ctx context.Context, item *items.Item, options ...*items.UpdateOptions) (err error) { err = m.Items.Update(ctx, item, options...) fields := []zapcore.Field{ diff --git a/pkg/items/middleware/middleware.go b/pkg/items/middleware/middleware.go index 52a1c1218d1605dc52ae80342684bb0339e63103..70a642a24c7e4ded173bbff5d21711e5d0b81afa 100644 --- a/pkg/items/middleware/middleware.go +++ b/pkg/items/middleware/middleware.go @@ -1,10 +1,10 @@ // Code generated by gowrap. DO NOT EDIT. -// template: ../../../assets/templates/middleware/middleware +// template: ../../../assets/templates/middleware/middleware.tmpl // gowrap: http://github.com/hexdigest/gowrap package middleware -//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/items -i Items -t ../../../assets/templates/middleware/middleware -o middleware.go -l "" +//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/items -i Items -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l "" import ( "git.perx.ru/perxis/perxis-go/pkg/items" @@ -13,12 +13,17 @@ import ( type Middleware func(items.Items) items.Items -func WithLog(s items.Items, logger *zap.Logger, log_access bool) items.Items { +func WithLog(s items.Items, logger, svcLogger *zap.Logger, log_access bool) items.Items { if logger == nil { logger = zap.NewNop() } - logger = logger.Named("Items") + + if svcLogger == nil { + svcLogger = zap.NewNop() + } + s = LogInfoMiddleware(svcLogger)(s) + s = ErrorLoggingMiddleware(logger)(s) if log_access { s = LoggingMiddleware(logger)(s)