diff --git a/assets/templates/middleware/middleware.tmpl b/assets/templates/middleware/middleware.tmpl
index c717d577e89331ed386cf21a1b8ba5486cd54714..7a34d393cbe71648913dd708d49118da36da1105 100755
--- a/assets/templates/middleware/middleware.tmpl
+++ b/assets/templates/middleware/middleware.tmpl
@@ -11,17 +11,14 @@ func WithLog(s {{.Interface.Type}}, logger *zap.Logger, log_access bool) {{.Inte
 		logger = zap.NewNop()
 	}
     logger = logger.Named("{{ .Interface.Name }}")
-    {{- if (has $serviceName (list "Items" "Collections") ) }}
 	if log_access {
 		s = AccessLoggingMiddleware(logger)(s)
 	}
-	s = LoggingMiddleware(logger)(s)
-	{{ else }}
-	s = ErrorLoggingMiddleware(logger)(s)
-	if log_access {
+	{{- if (has $serviceName (list "Items" "Collections") ) }}
 		s = LoggingMiddleware(logger)(s)
-	}
-	{{ end -}}
+	{{ else }}
+		s = ErrorLoggingMiddleware(logger)(s)
+	{{ end }}
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/id/object_id_test.go b/id/object_id_test.go
index 572f0da96c190a2138875c6b7dcb24c237fbe6fa..4f8d018139ce0b125e09124e5113e94c8031f5b3 100644
--- a/id/object_id_test.go
+++ b/id/object_id_test.go
@@ -3,6 +3,7 @@ package id
 import (
 	"testing"
 
+	"git.perx.ru/perxis/perxis-go/pkg/items"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
@@ -10,7 +11,7 @@ import (
 func Test_ParseID(t *testing.T) {
 	tests := []struct {
 		name      string
-		id        string
+		id        any
 		result    *ObjectId
 		wantError bool
 	}{
@@ -104,6 +105,16 @@ func Test_ParseID(t *testing.T) {
 			result:    nil,
 			wantError: true,
 		},
+		{
+			name:      "With error #6: nil value",
+			id:        nil,
+			wantError: true,
+		},
+		{
+			name:      "With error #7: nil object value",
+			id:        (*items.Item)(nil),
+			wantError: true,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
diff --git a/id/registry.go b/id/registry.go
index e457b9baf639cafe88b1d72974a1e955fd711fab..0ffec0240952b742c33a4763c6ee49fa210ce4f0 100644
--- a/id/registry.go
+++ b/id/registry.go
@@ -61,7 +61,12 @@ func (r *Registry) FromMap(m map[string]interface{}) (*ObjectId, error) {
 }
 
 func (r *Registry) FromObject(v interface{}) (*ObjectId, error) {
-	t := reflect.TypeOf(v)
+	value := reflect.ValueOf(v)
+	if v == nil || (value.Kind() == reflect.Ptr && value.IsNil()) {
+		return nil, fmt.Errorf("object value is nil")
+	}
+
+	t := value.Type()
 	if handler, ok := r.handlers[t]; ok {
 		i := handler(v)
 		if i == nil {
diff --git a/images/middleware/access_logging_middleware.go b/images/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..0a5f5ec2374db349e5eea81ec147d8258649412f
--- /dev/null
+++ b/images/middleware/access_logging_middleware.go
@@ -0,0 +1,53 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/images -i Images -t ../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/images"
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/files"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements images.Images that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   images.Images
+}
+
+// AccessLoggingMiddleware instruments an implementation of the images.Images with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next images.Images) images.Images {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, source *files.File, opts *images.GetOptions) (result *files.File, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("source", source),
+		zap.Reflect("opts", opts),
+	)
+
+	result, err = m.next.Get(ctx, source, opts)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("result", result),
+		zap.Error(err),
+	)
+
+	return result, err
+}
diff --git a/images/middleware/logging_middleware.go b/images/middleware/logging_middleware.go
deleted file mode 100644
index a69a56ee6a236aab96b1d22340691a63e36fdc01..0000000000000000000000000000000000000000
--- a/images/middleware/logging_middleware.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-package middleware
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/images -i Images -t ../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/images"
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/files"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements images.Images that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   images.Images
-}
-
-// LoggingMiddleware instruments an implementation of the images.Images with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next images.Images) images.Images {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, source *files.File, opts *images.GetOptions) (result *files.File, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"source": source,
-		"opts":   opts} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	result, err = m.next.Get(ctx, source, opts)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"result": result,
-		"err":    err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return result, err
-}
diff --git a/images/middleware/middleware.go b/images/middleware/middleware.go
index e29bdeb8c6e7a5e2d6b298d01069f4566481e80a..bf07dd54eb80280edf4ea7edc2ac43d66085ae2d 100644
--- a/images/middleware/middleware.go
+++ b/images/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/images -i Images -t ../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/images -i Images -t ../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/images"
@@ -17,12 +17,12 @@ func WithLog(s images.Images, logger *zap.Logger, log_access bool) images.Images
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Images")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/images/middleware/recovering_middleware.go b/images/middleware/recovering_middleware.go
index 9ad61603a2584b58f4635c9ee8296f67f047b7a5..9c0a447e802a95d3002f6e45060a2a359024ff5a 100644
--- a/images/middleware/recovering_middleware.go
+++ b/images/middleware/recovering_middleware.go
@@ -1,5 +1,5 @@
 // Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/recovery
+// template: ../../assets/templates/middleware/recovery
 // gowrap: http://github.com/hexdigest/gowrap
 
 package middleware
diff --git a/log/middleware/logging_middleware.go b/log/middleware/logging_middleware.go
deleted file mode 100644
index f693795ba6b45bc915212f968c6347a0aa7aed61..0000000000000000000000000000000000000000
--- a/log/middleware/logging_middleware.go
+++ /dev/null
@@ -1,145 +0,0 @@
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-package middleware
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/log -i Service -t ../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/log"
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/options"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements log.Service that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   log.Service
-}
-
-// LoggingMiddleware instruments an implementation of the log.Service with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next log.Service) log.Service {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Delete(ctx context.Context, filter *log.Filter) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"filter": filter} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Request", fields...)
-
-	err = m.next.Delete(ctx, filter)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Find(ctx context.Context, filter *log.Filter, options *options.FindOptions) (fp1 *log.FindResult, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"filter":  filter,
-		"options": options} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Find.Request", fields...)
-
-	fp1, err = m.next.Find(ctx, filter, options)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"fp1": fp1,
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Find.Response", fields...)
-
-	return fp1, err
-}
-
-func (m *loggingMiddleware) Log(ctx context.Context, entries []*log.Entry) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"entries": entries} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Log.Request", fields...)
-
-	err = m.next.Log(ctx, entries)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Log.Response", fields...)
-
-	return err
-}
diff --git a/log/middleware/middleware.go b/log/middleware/middleware.go
deleted file mode 100644
index 2fa83f77f251603392126319e61e27158b0dc3cc..0000000000000000000000000000000000000000
--- a/log/middleware/middleware.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../assets/templates/middleware/middleware
-// gowrap: http://github.com/hexdigest/gowrap
-
-package middleware
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/log -i Service -t ../../assets/templates/middleware/middleware -o middleware.go -l ""
-
-import (
-	"git.perx.ru/perxis/perxis-go/log"
-	"go.uber.org/zap"
-)
-
-type Middleware func(log.Service) log.Service
-
-func WithLog(s log.Service, logger *zap.Logger, log_access bool) log.Service {
-	if logger == nil {
-		logger = zap.NewNop()
-	}
-
-	logger = logger.Named("Service")
-	s = ErrorLoggingMiddleware(logger)(s)
-	if log_access {
-		s = LoggingMiddleware(logger)(s)
-	}
-	s = RecoveringMiddleware(logger)(s)
-	return s
-}
diff --git a/log/middleware/telemetry_middleware.go b/log/middleware/telemetry_middleware.go
deleted file mode 100644
index f5ba0676cf727ae7d70809b789002b61afe70bf3..0000000000000000000000000000000000000000
--- a/log/middleware/telemetry_middleware.go
+++ /dev/null
@@ -1,221 +0,0 @@
-// Code generated by gowrap. DO NOT EDIT.
-// template: ..\..\..\assets\templates\middleware\telemetry
-// gowrap: http://github.com/hexdigest/gowrap
-
-package middleware
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/collaborators -i log -i Service -t ../../assets/templates/middleware/telemetry -o telemetry_middleware.go -l ""
-
-// source template: https://github.com/hexdigest/gowrap/blob/master/templates/opentelemetry
-
-import (
-	"context"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/collaborators"
-	"git.perx.ru/perxis/perxis-go/pkg/telemetry/metrics"
-	"go.opentelemetry.io/otel"
-	"go.opentelemetry.io/otel/attribute"
-	otelmetric "go.opentelemetry.io/otel/metric"
-	"go.opentelemetry.io/otel/trace"
-)
-
-// telemetryMiddleware implements collaborators.Collaborators interface instrumented with opentracing spans
-type telemetryMiddleware struct {
-	collaborators.Collaborators
-	_instance      string
-	requestMetrics *metrics.RequestMetrics
-	_spanDecorator func(span trace.Span, params, results map[string]interface{})
-}
-
-// TelemetryMiddleware returns telemetryMiddleware
-func TelemetryMiddleware(base collaborators.Collaborators, instance string, spanDecorator ...func(span trace.Span, params, results map[string]interface{})) telemetryMiddleware {
-	requestMetrics, err := metrics.GetRequestMetrics()
-	if err != nil {
-		panic(err)
-	}
-
-	d := telemetryMiddleware{
-		Collaborators:  base,
-		_instance:      instance,
-		requestMetrics: requestMetrics,
-	}
-
-	if len(spanDecorator) > 0 && spanDecorator[0] != nil {
-		d._spanDecorator = spanDecorator[0]
-	}
-
-	return d
-}
-
-// Get implements collaborators.Collaborators
-func (_d telemetryMiddleware) Get(ctx context.Context, spaceId string, subject string) (role string, err error) {
-	attributes := otelmetric.WithAttributeSet(attribute.NewSet(
-		attribute.String("service", "Collaborators"),
-		attribute.String("method", "Get"),
-	))
-
-	_d.requestMetrics.Total.Add(ctx, 1, attributes)
-
-	start := time.Now()
-	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Collaborators.Get")
-
-	defer func() {
-		_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
-
-		if _d._spanDecorator != nil {
-			_d._spanDecorator(_span, map[string]interface{}{
-				"ctx":     ctx,
-				"spaceId": spaceId,
-				"subject": subject}, map[string]interface{}{
-				"role": role,
-				"err":  err})
-		} else if err != nil {
-			_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
-
-			_span.RecordError(err)
-			_span.SetAttributes(attribute.String("event", "error"))
-			_span.SetAttributes(attribute.String("message", err.Error()))
-		}
-
-		_span.End()
-	}()
-	return _d.Collaborators.Get(ctx, spaceId, subject)
-}
-
-// ListCollaborators implements collaborators.Collaborators
-func (_d telemetryMiddleware) ListCollaborators(ctx context.Context, spaceId string) (collaborators []*collaborators.Collaborator, err error) {
-	attributes := otelmetric.WithAttributeSet(attribute.NewSet(
-		attribute.String("service", "Collaborators"),
-		attribute.String("method", "ListCollaborators"),
-	))
-
-	_d.requestMetrics.Total.Add(ctx, 1, attributes)
-
-	start := time.Now()
-	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Collaborators.ListCollaborators")
-
-	defer func() {
-		_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
-
-		if _d._spanDecorator != nil {
-			_d._spanDecorator(_span, map[string]interface{}{
-				"ctx":     ctx,
-				"spaceId": spaceId}, map[string]interface{}{
-				"collaborators": collaborators,
-				"err":           err})
-		} else if err != nil {
-			_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
-
-			_span.RecordError(err)
-			_span.SetAttributes(attribute.String("event", "error"))
-			_span.SetAttributes(attribute.String("message", err.Error()))
-		}
-
-		_span.End()
-	}()
-	return _d.Collaborators.ListCollaborators(ctx, spaceId)
-}
-
-// ListSpaces implements collaborators.Collaborators
-func (_d telemetryMiddleware) ListSpaces(ctx context.Context, subject string) (spaces []*collaborators.Collaborator, err error) {
-	attributes := otelmetric.WithAttributeSet(attribute.NewSet(
-		attribute.String("service", "Collaborators"),
-		attribute.String("method", "ListSpaces"),
-	))
-
-	_d.requestMetrics.Total.Add(ctx, 1, attributes)
-
-	start := time.Now()
-	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Collaborators.ListSpaces")
-
-	defer func() {
-		_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
-
-		if _d._spanDecorator != nil {
-			_d._spanDecorator(_span, map[string]interface{}{
-				"ctx":     ctx,
-				"subject": subject}, map[string]interface{}{
-				"spaces": spaces,
-				"err":    err})
-		} else if err != nil {
-			_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
-
-			_span.RecordError(err)
-			_span.SetAttributes(attribute.String("event", "error"))
-			_span.SetAttributes(attribute.String("message", err.Error()))
-		}
-
-		_span.End()
-	}()
-	return _d.Collaborators.ListSpaces(ctx, subject)
-}
-
-// Remove implements collaborators.Collaborators
-func (_d telemetryMiddleware) Remove(ctx context.Context, spaceId string, subject string) (err error) {
-	attributes := otelmetric.WithAttributeSet(attribute.NewSet(
-		attribute.String("service", "Collaborators"),
-		attribute.String("method", "Remove"),
-	))
-
-	_d.requestMetrics.Total.Add(ctx, 1, attributes)
-
-	start := time.Now()
-	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Collaborators.Remove")
-
-	defer func() {
-		_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
-
-		if _d._spanDecorator != nil {
-			_d._spanDecorator(_span, map[string]interface{}{
-				"ctx":     ctx,
-				"spaceId": spaceId,
-				"subject": subject}, map[string]interface{}{
-				"err": err})
-		} else if err != nil {
-			_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
-
-			_span.RecordError(err)
-			_span.SetAttributes(attribute.String("event", "error"))
-			_span.SetAttributes(attribute.String("message", err.Error()))
-		}
-
-		_span.End()
-	}()
-	return _d.Collaborators.Remove(ctx, spaceId, subject)
-}
-
-// Set implements collaborators.Collaborators
-func (_d telemetryMiddleware) Set(ctx context.Context, spaceId string, subject string, role string) (err error) {
-	attributes := otelmetric.WithAttributeSet(attribute.NewSet(
-		attribute.String("service", "Collaborators"),
-		attribute.String("method", "Set"),
-	))
-
-	_d.requestMetrics.Total.Add(ctx, 1, attributes)
-
-	start := time.Now()
-	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Collaborators.Set")
-
-	defer func() {
-		_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
-
-		if _d._spanDecorator != nil {
-			_d._spanDecorator(_span, map[string]interface{}{
-				"ctx":     ctx,
-				"spaceId": spaceId,
-				"subject": subject,
-				"role":    role}, map[string]interface{}{
-				"err": err})
-		} else if err != nil {
-			_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
-
-			_span.RecordError(err)
-			_span.SetAttributes(attribute.String("event", "error"))
-			_span.SetAttributes(attribute.String("message", err.Error()))
-		}
-
-		_span.End()
-	}()
-	return _d.Collaborators.Set(ctx, spaceId, subject, role)
-}
diff --git a/log/client.go b/logs/client.go
similarity index 92%
rename from log/client.go
rename to logs/client.go
index 65413f4f5ea9fd6d99b8d87bea668b6c585ba391..fc6a5b901343514c27a9f39e2c5c50ab234f1be7 100644
--- a/log/client.go
+++ b/logs/client.go
@@ -1,23 +1,23 @@
-package log
+package logs
 
 import (
 	"context"
 
 	errorsgrpc "git.perx.ru/perxis/perxis-go/pkg/errors/grpc"
 	"git.perx.ru/perxis/perxis-go/pkg/options"
-	pb "git.perx.ru/perxis/perxis-go/proto/log"
+	pb "git.perx.ru/perxis/perxis-go/proto/logs"
 	"google.golang.org/grpc"
 )
 
 type Client struct {
-	client pb.LogServiceClient
+	client pb.LogsServiceClient
 }
 
 var _ Service = &Client{}
 
 func NewClient(conn *grpc.ClientConn) *Client {
 	return &Client{
-		client: pb.NewLogServiceClient(conn),
+		client: pb.NewLogsServiceClient(conn),
 	}
 }
 
diff --git a/log/log.go b/logs/log.go
similarity index 98%
rename from log/log.go
rename to logs/log.go
index 05aff704243a60e52c70a7ee57cdb50f9c5884e7..2bc9dedf82c450e54d46363fbe63eceb44b1a50d 100644
--- a/log/log.go
+++ b/logs/log.go
@@ -1,10 +1,10 @@
-package log
+package logs
 
 import (
 	"time"
 
 	"git.perx.ru/perxis/perxis-go/id"
-	pb "git.perx.ru/perxis/perxis-go/proto/log"
+	pb "git.perx.ru/perxis/perxis-go/proto/logs"
 	"google.golang.org/protobuf/types/known/timestamppb"
 )
 
diff --git a/log/log_test.go b/logs/log_test.go
similarity index 99%
rename from log/log_test.go
rename to logs/log_test.go
index 72ab7d3c10459a8be5464f9bd51546f33df3e5f7..9ccb7e7065cccf5b3945339b6085a108e6b0fae2 100644
--- a/log/log_test.go
+++ b/logs/log_test.go
@@ -1,4 +1,4 @@
-package log
+package logs
 
 import (
 	"testing"
diff --git a/log/middleware/error_logging_middleware.go b/logs/middleware/error_logging_middleware.go
similarity index 69%
rename from log/middleware/error_logging_middleware.go
rename to logs/middleware/error_logging_middleware.go
index de13dcc4fa1d3f8edde99896cdfc24fe1a728128..5d6ab71065765f8c366dcf4f6528f944e27f87b1 100644
--- a/log/middleware/error_logging_middleware.go
+++ b/logs/middleware/error_logging_middleware.go
@@ -4,25 +4,25 @@
 
 package middleware
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/log -i Service -t ../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/logs -i Service -t ../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
 	"context"
 
-	"git.perx.ru/perxis/perxis-go/log"
+	"git.perx.ru/perxis/perxis-go/logs"
 	"git.perx.ru/perxis/perxis-go/pkg/options"
 	"go.uber.org/zap"
 )
 
-// errorLoggingMiddleware implements log.Service that is instrumented with logging
+// errorLoggingMiddleware implements logs.Service that is instrumented with logging
 type errorLoggingMiddleware struct {
 	logger *zap.Logger
-	next   log.Service
+	next   logs.Service
 }
 
-// ErrorLoggingMiddleware instruments an implementation of the log.Service with simple logging
+// ErrorLoggingMiddleware instruments an implementation of the logs.Service with simple logging
 func ErrorLoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next log.Service) log.Service {
+	return func(next logs.Service) logs.Service {
 		return &errorLoggingMiddleware{
 			next:   next,
 			logger: logger,
@@ -30,7 +30,7 @@ func ErrorLoggingMiddleware(logger *zap.Logger) Middleware {
 	}
 }
 
-func (m *errorLoggingMiddleware) Delete(ctx context.Context, filter *log.Filter) (err error) {
+func (m *errorLoggingMiddleware) Delete(ctx context.Context, filter *logs.Filter) (err error) {
 	logger := m.logger
 	defer func() {
 		if err != nil {
@@ -40,7 +40,7 @@ func (m *errorLoggingMiddleware) Delete(ctx context.Context, filter *log.Filter)
 	return m.next.Delete(ctx, filter)
 }
 
-func (m *errorLoggingMiddleware) Find(ctx context.Context, filter *log.Filter, options *options.FindOptions) (fp1 *log.FindResult, err error) {
+func (m *errorLoggingMiddleware) Find(ctx context.Context, filter *logs.Filter, options *options.FindOptions) (fp1 *logs.FindResult, err error) {
 	logger := m.logger
 	defer func() {
 		if err != nil {
@@ -50,7 +50,7 @@ func (m *errorLoggingMiddleware) Find(ctx context.Context, filter *log.Filter, o
 	return m.next.Find(ctx, filter, options)
 }
 
-func (m *errorLoggingMiddleware) Log(ctx context.Context, entries []*log.Entry) (err error) {
+func (m *errorLoggingMiddleware) Log(ctx context.Context, entries []*logs.Entry) (err error) {
 	logger := m.logger
 	defer func() {
 		if err != nil {
diff --git a/logs/middleware/logging_middleware.go b/logs/middleware/logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..3a425bf03a64b0f5fa6d998db8d4076f92755d29
--- /dev/null
+++ b/logs/middleware/logging_middleware.go
@@ -0,0 +1,89 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/logs -i Service -t ../../assets/templates/middleware/access_log.tmpl -o logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/logs"
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/options"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements logs.Service that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   logs.Service
+}
+
+// AccessLoggingMiddleware instruments an implementation of the logs.Service with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next logs.Service) logs.Service {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Delete(ctx context.Context, filter *logs.Filter) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Delete.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("filter", filter),
+	)
+
+	err = m.next.Delete(ctx, filter)
+
+	m.logger.Debug("Delete.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Find(ctx context.Context, filter *logs.Filter, options *options.FindOptions) (fp1 *logs.FindResult, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Find.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("filter", filter),
+		zap.Reflect("options", options),
+	)
+
+	fp1, err = m.next.Find(ctx, filter, options)
+
+	m.logger.Debug("Find.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("fp1", fp1),
+		zap.Error(err),
+	)
+
+	return fp1, err
+}
+
+func (m *accessLoggingMiddleware) Log(ctx context.Context, entries []*logs.Entry) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Log.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("entries", entries),
+	)
+
+	err = m.next.Log(ctx, entries)
+
+	m.logger.Debug("Log.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/logs/middleware/middleware.go b/logs/middleware/middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..120d2b41cc8d392ed7ca2eff73f1f8b47c3dcc14
--- /dev/null
+++ b/logs/middleware/middleware.go
@@ -0,0 +1,28 @@
+// Code generated by gowrap. DO NOT EDIT.
+// 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/logs -i Service -t ../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
+
+import (
+	"git.perx.ru/perxis/perxis-go/logs"
+	"go.uber.org/zap"
+)
+
+type Middleware func(logs.Service) logs.Service
+
+func WithLog(s logs.Service, logger *zap.Logger, log_access bool) logs.Service {
+	if logger == nil {
+		logger = zap.NewNop()
+	}
+	logger = logger.Named("Service")
+	if log_access {
+		s = AccessLoggingMiddleware(logger)(s)
+	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
+	s = RecoveringMiddleware(logger)(s)
+	return s
+}
diff --git a/log/middleware/recovering_middleware.go b/logs/middleware/recovering_middleware.go
similarity index 72%
rename from log/middleware/recovering_middleware.go
rename to logs/middleware/recovering_middleware.go
index b8b3de39570f3fdece8969edb24c8f4a9dbcb0cb..950963dbf13a88fb5d82cecc7f983f1a605d0f84 100644
--- a/log/middleware/recovering_middleware.go
+++ b/logs/middleware/recovering_middleware.go
@@ -4,26 +4,26 @@
 
 package middleware
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/log -i Service -t ../../assets/templates/middleware/recovery -o recovering_middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/logs -i Service -t ../../assets/templates/middleware/recovery -o recovering_middleware.go -l ""
 
 import (
 	"context"
 	"fmt"
 
-	"git.perx.ru/perxis/perxis-go/log"
+	"git.perx.ru/perxis/perxis-go/logs"
 	"git.perx.ru/perxis/perxis-go/pkg/options"
 	"go.uber.org/zap"
 )
 
-// recoveringMiddleware implements log.Service that is instrumented with logging
+// recoveringMiddleware implements logs.Service that is instrumented with logging
 type recoveringMiddleware struct {
 	logger *zap.Logger
-	next   log.Service
+	next   logs.Service
 }
 
-// RecoveringMiddleware instruments an implementation of the log.Service with simple logging
+// RecoveringMiddleware instruments an implementation of the logs.Service with simple logging
 func RecoveringMiddleware(logger *zap.Logger) Middleware {
-	return func(next log.Service) log.Service {
+	return func(next logs.Service) logs.Service {
 		return &recoveringMiddleware{
 			next:   next,
 			logger: logger,
@@ -31,7 +31,7 @@ func RecoveringMiddleware(logger *zap.Logger) Middleware {
 	}
 }
 
-func (m *recoveringMiddleware) Delete(ctx context.Context, filter *log.Filter) (err error) {
+func (m *recoveringMiddleware) Delete(ctx context.Context, filter *logs.Filter) (err error) {
 	logger := m.logger
 	defer func() {
 		if r := recover(); r != nil {
@@ -43,7 +43,7 @@ func (m *recoveringMiddleware) Delete(ctx context.Context, filter *log.Filter) (
 	return m.next.Delete(ctx, filter)
 }
 
-func (m *recoveringMiddleware) Find(ctx context.Context, filter *log.Filter, options *options.FindOptions) (fp1 *log.FindResult, err error) {
+func (m *recoveringMiddleware) Find(ctx context.Context, filter *logs.Filter, options *options.FindOptions) (fp1 *logs.FindResult, err error) {
 	logger := m.logger
 	defer func() {
 		if r := recover(); r != nil {
@@ -55,7 +55,7 @@ func (m *recoveringMiddleware) Find(ctx context.Context, filter *log.Filter, opt
 	return m.next.Find(ctx, filter, options)
 }
 
-func (m *recoveringMiddleware) Log(ctx context.Context, entries []*log.Entry) (err error) {
+func (m *recoveringMiddleware) Log(ctx context.Context, entries []*logs.Entry) (err error) {
 	logger := m.logger
 	defer func() {
 		if r := recover(); r != nil {
diff --git a/logs/middleware/telemetry_middleware.go b/logs/middleware/telemetry_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..2aebc795b22d770c369f0445bfa543bde6828ac2
--- /dev/null
+++ b/logs/middleware/telemetry_middleware.go
@@ -0,0 +1,151 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../assets/templates/middleware/telemetry
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/logs -i Service -t ../../assets/templates/middleware/telemetry -o telemetry_middleware.go -l ""
+
+// source template: https://github.com/hexdigest/gowrap/blob/master/templates/opentelemetry
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/logs"
+	"git.perx.ru/perxis/perxis-go/pkg/options"
+	"git.perx.ru/perxis/perxis-go/pkg/telemetry/metrics"
+	"go.opentelemetry.io/otel"
+	"go.opentelemetry.io/otel/attribute"
+	otelmetric "go.opentelemetry.io/otel/metric"
+	"go.opentelemetry.io/otel/trace"
+)
+
+// telemetryMiddleware implements logs.Service interface instrumented with opentracing spans
+type telemetryMiddleware struct {
+	logs.Service
+	_instance      string
+	requestMetrics *metrics.RequestMetrics
+	_spanDecorator func(span trace.Span, params, results map[string]interface{})
+}
+
+// TelemetryMiddleware returns telemetryMiddleware
+func TelemetryMiddleware(base logs.Service, instance string, spanDecorator ...func(span trace.Span, params, results map[string]interface{})) telemetryMiddleware {
+	requestMetrics, err := metrics.GetRequestMetrics()
+	if err != nil {
+		panic(err)
+	}
+
+	d := telemetryMiddleware{
+		Service:        base,
+		_instance:      instance,
+		requestMetrics: requestMetrics,
+	}
+
+	if len(spanDecorator) > 0 && spanDecorator[0] != nil {
+		d._spanDecorator = spanDecorator[0]
+	}
+
+	return d
+}
+
+// Delete implements logs.Service
+func (_d telemetryMiddleware) Delete(ctx context.Context, filter *logs.Filter) (err error) {
+	attributes := otelmetric.WithAttributeSet(attribute.NewSet(
+		attribute.String("service", "Service"),
+		attribute.String("method", "Delete"),
+	))
+
+	_d.requestMetrics.Total.Add(ctx, 1, attributes)
+
+	start := time.Now()
+	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Service.Delete")
+
+	defer func() {
+		_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
+
+		if _d._spanDecorator != nil {
+			_d._spanDecorator(_span, map[string]interface{}{
+				"ctx":    ctx,
+				"filter": filter}, map[string]interface{}{
+				"err": err})
+		} else if err != nil {
+			_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
+
+			_span.RecordError(err)
+			_span.SetAttributes(attribute.String("event", "error"))
+			_span.SetAttributes(attribute.String("message", err.Error()))
+		}
+
+		_span.End()
+	}()
+	return _d.Service.Delete(ctx, filter)
+}
+
+// Find implements logs.Service
+func (_d telemetryMiddleware) Find(ctx context.Context, filter *logs.Filter, options *options.FindOptions) (fp1 *logs.FindResult, err error) {
+	attributes := otelmetric.WithAttributeSet(attribute.NewSet(
+		attribute.String("service", "Service"),
+		attribute.String("method", "Find"),
+	))
+
+	_d.requestMetrics.Total.Add(ctx, 1, attributes)
+
+	start := time.Now()
+	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Service.Find")
+
+	defer func() {
+		_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
+
+		if _d._spanDecorator != nil {
+			_d._spanDecorator(_span, map[string]interface{}{
+				"ctx":     ctx,
+				"filter":  filter,
+				"options": options}, map[string]interface{}{
+				"fp1": fp1,
+				"err": err})
+		} else if err != nil {
+			_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
+
+			_span.RecordError(err)
+			_span.SetAttributes(attribute.String("event", "error"))
+			_span.SetAttributes(attribute.String("message", err.Error()))
+		}
+
+		_span.End()
+	}()
+	return _d.Service.Find(ctx, filter, options)
+}
+
+// Log implements logs.Service
+func (_d telemetryMiddleware) Log(ctx context.Context, entries []*logs.Entry) (err error) {
+	attributes := otelmetric.WithAttributeSet(attribute.NewSet(
+		attribute.String("service", "Service"),
+		attribute.String("method", "Log"),
+	))
+
+	_d.requestMetrics.Total.Add(ctx, 1, attributes)
+
+	start := time.Now()
+	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Service.Log")
+
+	defer func() {
+		_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
+
+		if _d._spanDecorator != nil {
+			_d._spanDecorator(_span, map[string]interface{}{
+				"ctx":     ctx,
+				"entries": entries}, map[string]interface{}{
+				"err": err})
+		} else if err != nil {
+			_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
+
+			_span.RecordError(err)
+			_span.SetAttributes(attribute.String("event", "error"))
+			_span.SetAttributes(attribute.String("message", err.Error()))
+		}
+
+		_span.End()
+	}()
+	return _d.Service.Log(ctx, entries)
+}
diff --git a/log/mocks/Service.go b/logs/mocks/Service.go
similarity index 98%
rename from log/mocks/Service.go
rename to logs/mocks/Service.go
index 2957bf029c970d9fb65fc564af8d692e0d41e0de..af4da73bc4d4c7b088fbfea7e7babc4c1ba30e36 100644
--- a/log/mocks/Service.go
+++ b/logs/mocks/Service.go
@@ -5,7 +5,7 @@ package mocks
 import (
 	context "context"
 
-	log2 "git.perx.ru/perxis/perxis-go/log"
+	log2 "git.perx.ru/perxis/perxis-go/logs"
 	mock "github.com/stretchr/testify/mock"
 
 	options "git.perx.ru/perxis/perxis-go/pkg/options"
diff --git a/log/mocks/Storage.go b/logs/mocks/Storage.go
similarity index 98%
rename from log/mocks/Storage.go
rename to logs/mocks/Storage.go
index 33b9b97a992bdfe985642918543e7fb590440f50..87a6376d47ee44ece2f9d2458ee05e48a162b8ca 100644
--- a/log/mocks/Storage.go
+++ b/logs/mocks/Storage.go
@@ -5,7 +5,7 @@ package mocks
 import (
 	context "context"
 
-	log2 "git.perx.ru/perxis/perxis-go/log"
+	log2 "git.perx.ru/perxis/perxis-go/logs"
 	mock "github.com/stretchr/testify/mock"
 
 	options "git.perx.ru/perxis/perxis-go/pkg/options"
diff --git a/log/service.go b/logs/service.go
similarity index 96%
rename from log/service.go
rename to logs/service.go
index 46e306077d8ee3476dc1e83aa30a7501494325d5..34b3b4e61bd4b24c43dea910dcc54874deab13c5 100644
--- a/log/service.go
+++ b/logs/service.go
@@ -1,11 +1,11 @@
-package log
+package logs
 
 import (
 	"context"
 
 	itemstransportgrpc "git.perx.ru/perxis/perxis-go/pkg/items/transport/grpc"
 	"git.perx.ru/perxis/perxis-go/pkg/options"
-	pb "git.perx.ru/perxis/perxis-go/proto/log"
+	pb "git.perx.ru/perxis/perxis-go/proto/logs"
 )
 
 const ServiceName = "logs"
diff --git a/log/storage.go b/logs/storage.go
similarity index 96%
rename from log/storage.go
rename to logs/storage.go
index fd672e53584bf283fff6f1dc9f87cc1cccc71c7e..e6271dace2fca81715c0fa2d0982191c4fa517e6 100644
--- a/log/storage.go
+++ b/logs/storage.go
@@ -1,4 +1,4 @@
-package log
+package logs
 
 import (
 	"context"
diff --git a/log/zap/buffered_write_syncer.go b/logs/zap/buffered_write_syncer.go
similarity index 90%
rename from log/zap/buffered_write_syncer.go
rename to logs/zap/buffered_write_syncer.go
index b6149240b4c18f6255cc66d8da330aa9b5db318a..e862a79d115ecd82bc09622276d4194d39715345 100644
--- a/log/zap/buffered_write_syncer.go
+++ b/logs/zap/buffered_write_syncer.go
@@ -5,7 +5,7 @@ import (
 	"sync"
 	"time"
 
-	"git.perx.ru/perxis/perxis-go/log"
+	"git.perx.ru/perxis/perxis-go/logs"
 	"git.perx.ru/perxis/perxis-go/pkg/auth"
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
 )
@@ -18,9 +18,9 @@ const (
 
 var SyncQueueOverflow = errors.New("sync queue overflow")
 
-// BufferedWriteSyncer это WriteSyncer, который отправляет записи в log.Service.
+// BufferedWriteSyncer это WriteSyncer, который отправляет записи в logs.Service.
 // Когда количество буферизированных записей достигает некоторого предела или проходит определенный фиксированный интервал,
-// записи отправляются в очередь для синхронизации с log.Service.
+// записи отправляются в очередь для синхронизации с logs.Service.
 type BufferedWriteSyncer struct {
 	// FlushInterval устанавливает интервал, через который буферизированные записи будут отправлены на синхронизацию.
 	//
@@ -28,23 +28,23 @@ type BufferedWriteSyncer struct {
 	FlushInterval time.Duration
 
 	// MaxBufferSize устанавливает максимальное количество записей, которые могут быть буферизованы.
-	// Когда количество буферизованных записей превысит этот порог, они будут отправлены на синхронизацию в log.Service.
+	// Когда количество буферизованных записей превысит этот порог, они будут отправлены на синхронизацию в logs.Service.
 	//
 	// Значение по умолчанию для этого параметра равно 1000.
 	MaxBufferSize int
 
-	// MaxSyncQueueSize устанавливает максимальный размер очереди записей на синхронизацию с log.Service.
+	// MaxSyncQueueSize устанавливает максимальный размер очереди записей на синхронизацию с logs.Service.
 	//
 	// Значение по умолчанию для этого параметра равно 16.
 	MaxSyncQueueSize int
 
 	// Service сервис для хранения записей
-	Service log.Service
+	Service logs.Service
 
 	wg        sync.WaitGroup
 	mu        sync.RWMutex
-	buffer    []*log.Entry
-	syncQueue chan []*log.Entry
+	buffer    []*logs.Entry
+	syncQueue chan []*logs.Entry
 
 	flushStop chan struct{} // flushStop закрывается, когда flushLoop должен быть остановлен
 	started   bool          // started указывает, был ли выполнен Start
@@ -68,8 +68,8 @@ func (ws *BufferedWriteSyncer) start() {
 		ws.MaxSyncQueueSize = defaultMaxSyncQueueSize
 	}
 
-	ws.buffer = make([]*log.Entry, 0, ws.MaxBufferSize)
-	ws.syncQueue = make(chan []*log.Entry, ws.MaxSyncQueueSize)
+	ws.buffer = make([]*logs.Entry, 0, ws.MaxBufferSize)
+	ws.syncQueue = make(chan []*logs.Entry, ws.MaxSyncQueueSize)
 	ws.flushStop = make(chan struct{})
 
 	ws.wg.Add(2)
@@ -101,7 +101,7 @@ func (ws *BufferedWriteSyncer) Stop() error {
 
 // Write отправляет запись в буфер.
 // Когда количество буферизованных записей превышает максимальный размер буфера, буферизированные записи будут отправлены на синхронизацию.
-func (ws *BufferedWriteSyncer) Write(entry *log.Entry) error {
+func (ws *BufferedWriteSyncer) Write(entry *logs.Entry) error {
 	ws.mu.Lock()
 	defer ws.mu.Unlock()
 
@@ -149,7 +149,7 @@ func (ws *BufferedWriteSyncer) flush() error {
 	}
 
 	ws.syncQueue <- ws.buffer
-	ws.buffer = make([]*log.Entry, 0, ws.MaxBufferSize)
+	ws.buffer = make([]*logs.Entry, 0, ws.MaxBufferSize)
 
 	return nil
 }
@@ -172,7 +172,7 @@ func (ws *BufferedWriteSyncer) flushLoop() {
 	}
 }
 
-// syncLoop синхронизирует записи с log.Service.
+// syncLoop синхронизирует записи с logs.Service.
 func (ws *BufferedWriteSyncer) syncLoop() {
 	defer ws.wg.Done()
 
diff --git a/log/zap/buffered_write_syncer_test.go b/logs/zap/buffered_write_syncer_test.go
similarity index 78%
rename from log/zap/buffered_write_syncer_test.go
rename to logs/zap/buffered_write_syncer_test.go
index 58d64fa9f6a612f58701e5284262b505ec190cc5..073663edc829dd1847ce416b704916ec92ccc80c 100644
--- a/log/zap/buffered_write_syncer_test.go
+++ b/logs/zap/buffered_write_syncer_test.go
@@ -5,8 +5,8 @@ import (
 	"testing"
 	"time"
 
-	"git.perx.ru/perxis/perxis-go/log"
-	logmocks "git.perx.ru/perxis/perxis-go/log/mocks"
+	"git.perx.ru/perxis/perxis-go/logs"
+	logmocks "git.perx.ru/perxis/perxis-go/logs/mocks"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 	"github.com/stretchr/testify/require"
@@ -17,17 +17,17 @@ func TestBufferedWriteSyncer_Write(t *testing.T) {
 	service.On("Log", mock.Anything, mock.Anything).
 		Return(nil).
 		Run(func(args mock.Arguments) {
-			entries := args.Get(1).([]*log.Entry)
+			entries := args.Get(1).([]*logs.Entry)
 			require.Equal(t, 2, len(entries))
 		}).
 		Once()
 
 	ws := &BufferedWriteSyncer{Service: service}
 
-	err := ws.Write(&log.Entry{Message: "first log message"})
+	err := ws.Write(&logs.Entry{Message: "first log message"})
 	require.NoError(t, err)
 
-	err = ws.Write(&log.Entry{Message: "second log message"})
+	err = ws.Write(&logs.Entry{Message: "second log message"})
 	require.NoError(t, err)
 
 	err = ws.Stop()
@@ -41,7 +41,7 @@ func TestBufferedWriteSyncer_Write_Concurrent(t *testing.T) {
 	service.On("Log", mock.Anything, mock.Anything).
 		Return(nil).
 		Run(func(args mock.Arguments) {
-			entries := args.Get(1).([]*log.Entry)
+			entries := args.Get(1).([]*logs.Entry)
 			require.Equal(t, 100, len(entries))
 		}).
 		Once()
@@ -53,7 +53,7 @@ func TestBufferedWriteSyncer_Write_Concurrent(t *testing.T) {
 		wg.Add(1)
 		go func(wg *sync.WaitGroup) {
 			defer wg.Done()
-			require.NoError(t, ws.Write(&log.Entry{Message: "log message"}))
+			require.NoError(t, ws.Write(&logs.Entry{Message: "log message"}))
 		}(&wg)
 	}
 
@@ -68,7 +68,7 @@ func TestBufferedWriteSyncer_Flush(t *testing.T) {
 	service.On("Log", mock.Anything, mock.Anything).
 		Return(nil).
 		Run(func(args mock.Arguments) {
-			entries := args.Get(1).([]*log.Entry)
+			entries := args.Get(1).([]*logs.Entry)
 			require.Equal(t, 10, len(entries))
 		}).
 		Times(10)
@@ -77,7 +77,7 @@ func TestBufferedWriteSyncer_Flush(t *testing.T) {
 
 	for i := 0; i < 10; i++ {
 		for j := 0; j < 10; j++ {
-			require.NoError(t, ws.Write(&log.Entry{Message: "log message"}))
+			require.NoError(t, ws.Write(&logs.Entry{Message: "log message"}))
 		}
 		require.NoError(t, ws.Sync())
 	}
@@ -92,7 +92,7 @@ func TestBufferedWriteSyncer_MaxBufferSize(t *testing.T) {
 	service.On("Log", mock.Anything, mock.Anything).
 		Return(nil).
 		Run(func(args mock.Arguments) {
-			entries := args.Get(1).([]*log.Entry)
+			entries := args.Get(1).([]*logs.Entry)
 			assert.Equal(t, 10, len(entries))
 		}).
 		Times(10)
@@ -100,7 +100,7 @@ func TestBufferedWriteSyncer_MaxBufferSize(t *testing.T) {
 	ws := &BufferedWriteSyncer{Service: service, MaxBufferSize: 10}
 
 	for i := 0; i < 100; i++ {
-		require.NoError(t, ws.Write(&log.Entry{Message: "log message"}))
+		require.NoError(t, ws.Write(&logs.Entry{Message: "log message"}))
 	}
 
 	require.NoError(t, ws.Stop())
@@ -113,7 +113,7 @@ func TestBufferedWriteSyncer_FlushInterval(t *testing.T) {
 	service.On("Log", mock.Anything, mock.Anything).
 		Return(nil).
 		Run(func(args mock.Arguments) {
-			entries := args.Get(1).([]*log.Entry)
+			entries := args.Get(1).([]*logs.Entry)
 			assert.Equal(t, 10, len(entries))
 		}).
 		Once()
@@ -121,7 +121,7 @@ func TestBufferedWriteSyncer_FlushInterval(t *testing.T) {
 	ws := &BufferedWriteSyncer{Service: service, FlushInterval: time.Second}
 
 	for j := 0; j < 10; j++ {
-		require.NoError(t, ws.Write(&log.Entry{Message: "log message"}))
+		require.NoError(t, ws.Write(&logs.Entry{Message: "log message"}))
 	}
 
 	time.Sleep(3 * time.Second) // ждем, пока сработает интервал
diff --git a/log/zap/core.go b/logs/zap/core.go
similarity index 87%
rename from log/zap/core.go
rename to logs/zap/core.go
index 070e6fb84eb3ca74cd59262eb5244054967e9307..3b0c3305f685f8dfe52628dd49c1d4716fda9e91 100644
--- a/log/zap/core.go
+++ b/logs/zap/core.go
@@ -4,19 +4,19 @@ import (
 	"fmt"
 
 	oid "git.perx.ru/perxis/perxis-go/id"
-	"git.perx.ru/perxis/perxis-go/log"
+	"git.perx.ru/perxis/perxis-go/logs"
 	"git.perx.ru/perxis/perxis-go/pkg/id"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
 )
 
-// WriteSyncer отвечает за хранение и синхронизацию log.Entry
+// WriteSyncer отвечает за хранение и синхронизацию logs.Entry
 type WriteSyncer interface {
-	Write(entry *log.Entry) error
+	Write(entry *logs.Entry) error
 	Sync() error
 }
 
-// Core кодирует zapcore.Entry в log.Entry и отправляет их в WriteSyncer
+// Core кодирует zapcore.Entry в logs.Entry и отправляет их в WriteSyncer
 type Core struct {
 	zapcore.LevelEnabler
 
@@ -54,7 +54,7 @@ func (core *Core) Sync() error {
 	return core.writeSyncer.Sync()
 }
 
-func (core *Core) getEntry(entry zapcore.Entry, fields []zapcore.Field) *log.Entry {
+func (core *Core) getEntry(entry zapcore.Entry, fields []zapcore.Field) *logs.Entry {
 	if len(core.fields) > 0 {
 		fields = append(fields, core.fields...)
 	}
@@ -64,10 +64,10 @@ func (core *Core) getEntry(entry zapcore.Entry, fields []zapcore.Field) *log.Ent
 		field.AddTo(enc)
 	}
 
-	ent := &log.Entry{
+	ent := &logs.Entry{
 		ID:        id.GenerateNewID(),
 		Timestamp: entry.Time,
-		LogLevel:  log.Level(entry.Level),
+		LogLevel:  logs.Level(entry.Level),
 		Message:   entry.Message,
 	}
 
diff --git a/log/zap/core_test.go b/logs/zap/core_test.go
similarity index 92%
rename from log/zap/core_test.go
rename to logs/zap/core_test.go
index 8b2d64d75c737164f38b911fcbd4a9a0e0c56101..aabe9cea3da3f4eb4da1d0696c7c6fb08753cc63 100644
--- a/log/zap/core_test.go
+++ b/logs/zap/core_test.go
@@ -4,7 +4,7 @@ import (
 	"testing"
 
 	"git.perx.ru/perxis/perxis-go/id"
-	"git.perx.ru/perxis/perxis-go/log"
+	"git.perx.ru/perxis/perxis-go/logs"
 	logzap "git.perx.ru/perxis/perxis-go/zap"
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
@@ -20,7 +20,7 @@ func TestCore_getEntry(t *testing.T) {
 			entry  zapcore.Entry
 			fields []zapcore.Field
 		}
-		want *log.Entry
+		want *logs.Entry
 	}{
 		{
 			name: "simple",
@@ -40,8 +40,8 @@ func TestCore_getEntry(t *testing.T) {
 					logzap.Tags("tag1", "tag2", "tag3"),
 				},
 			},
-			want: &log.Entry{
-				LogLevel:  log.Level(zapcore.InfoLevel),
+			want: &logs.Entry{
+				LogLevel:  logs.Level(zapcore.InfoLevel),
 				Message:   "создан элемент коллекции",
 				Category:  "create",
 				Component: "Items.Service",
diff --git a/log/zap/example_test.go b/logs/zap/example_test.go
similarity index 90%
rename from log/zap/example_test.go
rename to logs/zap/example_test.go
index 1c506d1583240ffb3f692bd880797a69b0118c51..9dfd0aaa2f33820c72bffcdd6ecae965672ad838 100644
--- a/log/zap/example_test.go
+++ b/logs/zap/example_test.go
@@ -7,8 +7,8 @@ import (
 	"testing"
 
 	"git.perx.ru/perxis/perxis-go/id"
-	"git.perx.ru/perxis/perxis-go/log"
-	logmocks "git.perx.ru/perxis/perxis-go/log/mocks"
+	"git.perx.ru/perxis/perxis-go/logs"
+	logmocks "git.perx.ru/perxis/perxis-go/logs/mocks"
 	"git.perx.ru/perxis/perxis-go/pkg/auth"
 	"git.perx.ru/perxis/perxis-go/pkg/items"
 	"git.perx.ru/perxis/perxis-go/pkg/users"
@@ -24,9 +24,9 @@ func TestExample(t *testing.T) {
 	item := items.NewItem("WPNN", "9VGP", "GxNv", "W0fl", nil, nil)
 	user := &users.User{ID: "294de355"}
 
-	wantEntries := []*log.Entry{
+	wantEntries := []*logs.Entry{
 		{
-			LogLevel:  log.Level(zapcore.InfoLevel),
+			LogLevel:  logs.Level(zapcore.InfoLevel),
 			Message:   "Successfully created",
 			Component: "Items",
 			Event:     items.EventCreateItem,
@@ -35,7 +35,7 @@ func TestExample(t *testing.T) {
 			Tags:      []string{"tag1", "tag2", "tag3"},
 		},
 		{
-			LogLevel:  log.Level(zapcore.WarnLevel),
+			LogLevel:  logs.Level(zapcore.WarnLevel),
 			Message:   "Successfully updated",
 			Component: "Items",
 			Event:     items.EventUpdateItem,
@@ -49,8 +49,8 @@ func TestExample(t *testing.T) {
 	service.On("Log", mock.Anything, mock.Anything).
 		Return(nil).
 		Run(func(args mock.Arguments) {
-			entries := args.Get(1).([]*log.Entry)
-			require.True(t, slices.EqualFunc(wantEntries, entries, func(wantEntry, gotEntry *log.Entry) bool {
+			entries := args.Get(1).([]*logs.Entry)
+			require.True(t, slices.EqualFunc(wantEntries, entries, func(wantEntry, gotEntry *logs.Entry) bool {
 				require.NotEmpty(t, gotEntry.ID)
 				require.NotEmpty(t, gotEntry.Timestamp)
 				gotEntry.ID = wantEntry.ID               // игнорируем ID
diff --git a/perxis-proto b/perxis-proto
index 78fe6a1ea7e2fe588e4107bf14ac85293b201163..f10336dc4a4f58111c12dd95afec82be18388803 160000
--- a/perxis-proto
+++ b/perxis-proto
@@ -1 +1 @@
-Subproject commit 78fe6a1ea7e2fe588e4107bf14ac85293b201163
+Subproject commit f10336dc4a4f58111c12dd95afec82be18388803
diff --git a/pkg/clients/middleware/access_logging_middleware.go b/pkg/clients/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..66379ef014588aa0b6bcdb92863e00ba9f428fc5
--- /dev/null
+++ b/pkg/clients/middleware/access_logging_middleware.go
@@ -0,0 +1,167 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/clients -i Clients -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/clients"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements clients.Clients that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   clients.Clients
+}
+
+// AccessLoggingMiddleware instruments an implementation of the clients.Clients with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next clients.Clients) clients.Clients {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Create(ctx context.Context, client *clients.Client) (created *clients.Client, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Create.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("client", client),
+	)
+
+	created, err = m.next.Create(ctx, client)
+
+	m.logger.Debug("Create.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("created", created),
+		zap.Error(err),
+	)
+
+	return created, err
+}
+
+func (m *accessLoggingMiddleware) Delete(ctx context.Context, spaceId string, id string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Delete.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("id", id),
+	)
+
+	err = m.next.Delete(ctx, spaceId, id)
+
+	m.logger.Debug("Delete.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Enable(ctx context.Context, spaceId string, id string, enable bool) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Enable.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("id", id),
+		zap.Reflect("enable", enable),
+	)
+
+	err = m.next.Enable(ctx, spaceId, id, enable)
+
+	m.logger.Debug("Enable.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, spaceId string, id string) (client *clients.Client, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("id", id),
+	)
+
+	client, err = m.next.Get(ctx, spaceId, id)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("client", client),
+		zap.Error(err),
+	)
+
+	return client, err
+}
+
+func (m *accessLoggingMiddleware) GetBy(ctx context.Context, spaceId string, params *clients.GetByParams) (client *clients.Client, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("GetBy.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("params", params),
+	)
+
+	client, err = m.next.GetBy(ctx, spaceId, params)
+
+	m.logger.Debug("GetBy.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("client", client),
+		zap.Error(err),
+	)
+
+	return client, err
+}
+
+func (m *accessLoggingMiddleware) List(ctx context.Context, spaceId string) (clients []*clients.Client, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("List.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+	)
+
+	clients, err = m.next.List(ctx, spaceId)
+
+	m.logger.Debug("List.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("clients", clients),
+		zap.Error(err),
+	)
+
+	return clients, err
+}
+
+func (m *accessLoggingMiddleware) Update(ctx context.Context, client *clients.Client) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Update.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("client", client),
+	)
+
+	err = m.next.Update(ctx, client)
+
+	m.logger.Debug("Update.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/pkg/clients/middleware/error_logging_middleware.go b/pkg/clients/middleware/error_logging_middleware.go
index 0b96827a0c620ad1ca1aa5aaf6b93a821af6279d..3e60cc1d8e49f0712362a7e3e8f072571333a97a 100644
--- a/pkg/clients/middleware/error_logging_middleware.go
+++ b/pkg/clients/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/clients -i Clients -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/clients/middleware/logging_middleware.go b/pkg/clients/middleware/logging_middleware.go
deleted file mode 100644
index 6fa0e811c5511748b55d756742a2c81789c0cced..0000000000000000000000000000000000000000
--- a/pkg/clients/middleware/logging_middleware.go
+++ /dev/null
@@ -1,295 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/clients -i Clients -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/clients"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements clients.Clients that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   clients.Clients
-}
-
-// LoggingMiddleware instruments an implementation of the clients.Clients with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next clients.Clients) clients.Clients {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Create(ctx context.Context, client *clients.Client) (created *clients.Client, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"client": client} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Request", fields...)
-
-	created, err = m.next.Create(ctx, client)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"created": created,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Response", fields...)
-
-	return created, err
-}
-
-func (m *loggingMiddleware) Delete(ctx context.Context, spaceId string, id string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"id":      id} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Request", fields...)
-
-	err = m.next.Delete(ctx, spaceId, id)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Enable(ctx context.Context, spaceId string, id string, enable bool) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"id":      id,
-		"enable":  enable} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Enable.Request", fields...)
-
-	err = m.next.Enable(ctx, spaceId, id, enable)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Enable.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, spaceId string, id string) (client *clients.Client, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"id":      id} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	client, err = m.next.Get(ctx, spaceId, id)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"client": client,
-		"err":    err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return client, err
-}
-
-func (m *loggingMiddleware) GetBy(ctx context.Context, spaceId string, params *clients.GetByParams) (client *clients.Client, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"params":  params} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("GetBy.Request", fields...)
-
-	client, err = m.next.GetBy(ctx, spaceId, params)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"client": client,
-		"err":    err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("GetBy.Response", fields...)
-
-	return client, err
-}
-
-func (m *loggingMiddleware) List(ctx context.Context, spaceId string) (clients []*clients.Client, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Request", fields...)
-
-	clients, err = m.next.List(ctx, spaceId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"clients": clients,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Response", fields...)
-
-	return clients, err
-}
-
-func (m *loggingMiddleware) Update(ctx context.Context, client *clients.Client) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"client": client} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Request", fields...)
-
-	err = m.next.Update(ctx, client)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Response", fields...)
-
-	return err
-}
diff --git a/pkg/clients/middleware/middleware.go b/pkg/clients/middleware/middleware.go
index a49c9b3ebb0c041c23178d457ea5ddf2d2357d91..0c72c1660e15f147a773e2da5e2f31b469b90260 100644
--- a/pkg/clients/middleware/middleware.go
+++ b/pkg/clients/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/clients -i Clients -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/clients -i Clients -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/clients"
@@ -17,12 +17,12 @@ func WithLog(s clients.Clients, logger *zap.Logger, log_access bool) clients.Cli
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Clients")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/collaborators/middleware/access_logging_middleware.go b/pkg/collaborators/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..505624ba33f2f91280d3b1dce338262f4a7405d3
--- /dev/null
+++ b/pkg/collaborators/middleware/access_logging_middleware.go
@@ -0,0 +1,129 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/collaborators -i Collaborators -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/collaborators"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements collaborators.Collaborators that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   collaborators.Collaborators
+}
+
+// AccessLoggingMiddleware instruments an implementation of the collaborators.Collaborators with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next collaborators.Collaborators) collaborators.Collaborators {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, spaceId string, subject string) (role string, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("subject", subject),
+	)
+
+	role, err = m.next.Get(ctx, spaceId, subject)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("role", role),
+		zap.Error(err),
+	)
+
+	return role, err
+}
+
+func (m *accessLoggingMiddleware) ListCollaborators(ctx context.Context, spaceId string) (collaborators []*collaborators.Collaborator, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("ListCollaborators.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+	)
+
+	collaborators, err = m.next.ListCollaborators(ctx, spaceId)
+
+	m.logger.Debug("ListCollaborators.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("collaborators", collaborators),
+		zap.Error(err),
+	)
+
+	return collaborators, err
+}
+
+func (m *accessLoggingMiddleware) ListSpaces(ctx context.Context, subject string) (spaces []*collaborators.Collaborator, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("ListSpaces.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("subject", subject),
+	)
+
+	spaces, err = m.next.ListSpaces(ctx, subject)
+
+	m.logger.Debug("ListSpaces.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("spaces", spaces),
+		zap.Error(err),
+	)
+
+	return spaces, err
+}
+
+func (m *accessLoggingMiddleware) Remove(ctx context.Context, spaceId string, subject string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Remove.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("subject", subject),
+	)
+
+	err = m.next.Remove(ctx, spaceId, subject)
+
+	m.logger.Debug("Remove.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Set(ctx context.Context, spaceId string, subject string, role string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Set.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("subject", subject),
+		zap.Reflect("role", role),
+	)
+
+	err = m.next.Set(ctx, spaceId, subject, role)
+
+	m.logger.Debug("Set.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/pkg/collaborators/middleware/error_logging_middleware.go b/pkg/collaborators/middleware/error_logging_middleware.go
index b0bc4518dad30925e41562f334e1891e2c4fb633..6f67ce3ff960815793c8c59d588b012980559334 100644
--- a/pkg/collaborators/middleware/error_logging_middleware.go
+++ b/pkg/collaborators/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/collaborators -i Collaborators -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/collaborators/middleware/logging_middleware.go b/pkg/collaborators/middleware/logging_middleware.go
deleted file mode 100644
index 4b4569a48b0900027cf1453779913996b5146525..0000000000000000000000000000000000000000
--- a/pkg/collaborators/middleware/logging_middleware.go
+++ /dev/null
@@ -1,221 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/collaborators -i Collaborators -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/collaborators"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements collaborators.Collaborators that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   collaborators.Collaborators
-}
-
-// LoggingMiddleware instruments an implementation of the collaborators.Collaborators with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next collaborators.Collaborators) collaborators.Collaborators {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, spaceId string, subject string) (role string, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"subject": subject} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	role, err = m.next.Get(ctx, spaceId, subject)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"role": role,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return role, err
-}
-
-func (m *loggingMiddleware) ListCollaborators(ctx context.Context, spaceId string) (collaborators []*collaborators.Collaborator, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListCollaborators.Request", fields...)
-
-	collaborators, err = m.next.ListCollaborators(ctx, spaceId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"collaborators": collaborators,
-		"err":           err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListCollaborators.Response", fields...)
-
-	return collaborators, err
-}
-
-func (m *loggingMiddleware) ListSpaces(ctx context.Context, subject string) (spaces []*collaborators.Collaborator, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"subject": subject} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListSpaces.Request", fields...)
-
-	spaces, err = m.next.ListSpaces(ctx, subject)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"spaces": spaces,
-		"err":    err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListSpaces.Response", fields...)
-
-	return spaces, err
-}
-
-func (m *loggingMiddleware) Remove(ctx context.Context, spaceId string, subject string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"subject": subject} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Remove.Request", fields...)
-
-	err = m.next.Remove(ctx, spaceId, subject)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Remove.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Set(ctx context.Context, spaceId string, subject string, role string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"subject": subject,
-		"role":    role} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Set.Request", fields...)
-
-	err = m.next.Set(ctx, spaceId, subject, role)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Set.Response", fields...)
-
-	return err
-}
diff --git a/pkg/collaborators/middleware/middleware.go b/pkg/collaborators/middleware/middleware.go
index 60931c8494b76be2fe0657ec0d204377e58e0c11..28f0bc687c5ee66f2395303efa502149f8394644 100644
--- a/pkg/collaborators/middleware/middleware.go
+++ b/pkg/collaborators/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/collaborators -i Collaborators -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/collaborators -i Collaborators -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/collaborators"
@@ -17,12 +17,12 @@ func WithLog(s collaborators.Collaborators, logger *zap.Logger, log_access bool)
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Collaborators")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/collaborators/middleware/recovering_middleware.go b/pkg/collaborators/middleware/recovering_middleware.go
index 0521cce7a30c9b86cb0fe0a04d058c70a9c48cf4..2217ca1f5827cf228c537223c3181701948b50a5 100644
--- a/pkg/collaborators/middleware/recovering_middleware.go
+++ b/pkg/collaborators/middleware/recovering_middleware.go
@@ -1,5 +1,5 @@
 // Code generated by gowrap. DO NOT EDIT.
-// template: ../../../../assets/templates/middleware/recovery
+// template: ../../../assets/templates/middleware/recovery
 // gowrap: http://github.com/hexdigest/gowrap
 
 package middleware
diff --git a/pkg/collections/middleware/logging_middleware.go b/pkg/collections/middleware/logging_middleware.go
index c5e2e2fb3e5bf604fdb57c8484f4a20289029da6..bf04a4aac6e1f5304e982dac0b6c77662715a1cc 100644
--- a/pkg/collections/middleware/logging_middleware.go
+++ b/pkg/collections/middleware/logging_middleware.go
@@ -1,11 +1,5 @@
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/log.tmpl
-// gowrap: http://github.com/hexdigest/gowrap
-
 package middleware
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/collections -i Collections -t ../../../assets/templates/middleware/log.tmpl -o logging_middleware.go -l ""
-
 import (
 	"context"
 
@@ -100,11 +94,11 @@ func (m *loggingMiddleware) SetSchema(ctx context.Context, spaceId string, envId
 
 	err = m.next.SetSchema(ctx, spaceId, envId, collectionId, schema)
 	if err != nil {
-		logger.Error("Failed to setschema", zap.Error(err), logzap.Channels(logzap.Userlog, logzap.Syslog))
+		logger.Error("Failed to set schema", zap.Error(err), logzap.Channels(logzap.Userlog, logzap.Syslog))
 		return
 	}
 
-	logger.Info("Successfully setschemaed", logzap.Channels(logzap.Userlog))
+	logger.Info("Successfully set schema", logzap.Channels(logzap.Userlog))
 	return err
 }
 
@@ -115,10 +109,11 @@ func (m *loggingMiddleware) SetState(ctx context.Context, spaceId string, envId
 
 	err = m.next.SetState(ctx, spaceId, envId, collectionId, state)
 	if err != nil {
-		logger.Error("Failed to setstate", zap.Error(err))
+		logger.Error("Failed to set state", zap.Error(err))
 		return
 	}
 
+	logger.Info("Successfully set state", logzap.Channels(logzap.Userlog))
 	return err
 }
 
diff --git a/pkg/environments/middleware/access_logging_middleware.go b/pkg/environments/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..e357e2ec9786edb9f67a7b14445558f86938e924
--- /dev/null
+++ b/pkg/environments/middleware/access_logging_middleware.go
@@ -0,0 +1,187 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/environments -i Environments -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/environments"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements environments.Environments that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   environments.Environments
+}
+
+// AccessLoggingMiddleware instruments an implementation of the environments.Environments with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next environments.Environments) environments.Environments {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Create(ctx context.Context, env *environments.Environment) (created *environments.Environment, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Create.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("env", env),
+	)
+
+	created, err = m.next.Create(ctx, env)
+
+	m.logger.Debug("Create.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("created", created),
+		zap.Error(err),
+	)
+
+	return created, err
+}
+
+func (m *accessLoggingMiddleware) Delete(ctx context.Context, spaceId string, envId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Delete.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("envId", envId),
+	)
+
+	err = m.next.Delete(ctx, spaceId, envId)
+
+	m.logger.Debug("Delete.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, spaceId string, envId string) (env *environments.Environment, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("envId", envId),
+	)
+
+	env, err = m.next.Get(ctx, spaceId, envId)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("env", env),
+		zap.Error(err),
+	)
+
+	return env, err
+}
+
+func (m *accessLoggingMiddleware) List(ctx context.Context, spaceId string) (envs []*environments.Environment, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("List.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+	)
+
+	envs, err = m.next.List(ctx, spaceId)
+
+	m.logger.Debug("List.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("envs", envs),
+		zap.Error(err),
+	)
+
+	return envs, err
+}
+
+func (m *accessLoggingMiddleware) Migrate(ctx context.Context, spaceId string, envId string, options ...*environments.MigrateOptions) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Migrate.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("envId", envId),
+		zap.Reflect("options", options),
+	)
+
+	err = m.next.Migrate(ctx, spaceId, envId, options...)
+
+	m.logger.Debug("Migrate.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) RemoveAlias(ctx context.Context, spaceId string, envId string, alias string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("RemoveAlias.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("envId", envId),
+		zap.Reflect("alias", alias),
+	)
+
+	err = m.next.RemoveAlias(ctx, spaceId, envId, alias)
+
+	m.logger.Debug("RemoveAlias.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) SetAlias(ctx context.Context, spaceId string, envId string, alias string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("SetAlias.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("envId", envId),
+		zap.Reflect("alias", alias),
+	)
+
+	err = m.next.SetAlias(ctx, spaceId, envId, alias)
+
+	m.logger.Debug("SetAlias.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Update(ctx context.Context, env *environments.Environment) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Update.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("env", env),
+	)
+
+	err = m.next.Update(ctx, env)
+
+	m.logger.Debug("Update.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/pkg/environments/middleware/error_logging_middleware.go b/pkg/environments/middleware/error_logging_middleware.go
index 91ff984763f696cde9f8c152f96842ae995a411e..812de4033878fe1c6d774730c68d2e6e00489751 100644
--- a/pkg/environments/middleware/error_logging_middleware.go
+++ b/pkg/environments/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/environments -i Environments -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/environments/middleware/logging_middleware.go b/pkg/environments/middleware/logging_middleware.go
deleted file mode 100644
index 74692e333c12a3230a03b0cf584010745fb52329..0000000000000000000000000000000000000000
--- a/pkg/environments/middleware/logging_middleware.go
+++ /dev/null
@@ -1,333 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/environments -i Environments -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/environments"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements environments.Environments that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   environments.Environments
-}
-
-// LoggingMiddleware instruments an implementation of the environments.Environments with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next environments.Environments) environments.Environments {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Create(ctx context.Context, env *environments.Environment) (created *environments.Environment, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"env": env} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Request", fields...)
-
-	created, err = m.next.Create(ctx, env)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"created": created,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Response", fields...)
-
-	return created, err
-}
-
-func (m *loggingMiddleware) Delete(ctx context.Context, spaceId string, envId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"envId":   envId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Request", fields...)
-
-	err = m.next.Delete(ctx, spaceId, envId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, spaceId string, envId string) (env *environments.Environment, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"envId":   envId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	env, err = m.next.Get(ctx, spaceId, envId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"env": env,
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return env, err
-}
-
-func (m *loggingMiddleware) List(ctx context.Context, spaceId string) (envs []*environments.Environment, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Request", fields...)
-
-	envs, err = m.next.List(ctx, spaceId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"envs": envs,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Response", fields...)
-
-	return envs, err
-}
-
-func (m *loggingMiddleware) Migrate(ctx context.Context, spaceId string, envId string, options ...*environments.MigrateOptions) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"envId":   envId,
-		"options": options} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Migrate.Request", fields...)
-
-	err = m.next.Migrate(ctx, spaceId, envId, options...)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Migrate.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) RemoveAlias(ctx context.Context, spaceId string, envId string, alias string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"envId":   envId,
-		"alias":   alias} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("RemoveAlias.Request", fields...)
-
-	err = m.next.RemoveAlias(ctx, spaceId, envId, alias)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("RemoveAlias.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) SetAlias(ctx context.Context, spaceId string, envId string, alias string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"envId":   envId,
-		"alias":   alias} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("SetAlias.Request", fields...)
-
-	err = m.next.SetAlias(ctx, spaceId, envId, alias)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("SetAlias.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Update(ctx context.Context, env *environments.Environment) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"env": env} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Request", fields...)
-
-	err = m.next.Update(ctx, env)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Response", fields...)
-
-	return err
-}
diff --git a/pkg/environments/middleware/middleware.go b/pkg/environments/middleware/middleware.go
index cfc89b98b7b17b5335afb81ea3dc5d686a9c892b..7c887417848d7cdea79681b73d7c1954318ad009 100644
--- a/pkg/environments/middleware/middleware.go
+++ b/pkg/environments/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/environments -i Environments -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/environments -i Environments -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/environments"
@@ -17,12 +17,12 @@ func WithLog(s environments.Environments, logger *zap.Logger, log_access bool) e
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Environments")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/extension/middleware/access_logging_middleware.go b/pkg/extension/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..0fbd63de8991c449fc96ad49527f5e079bd88773
--- /dev/null
+++ b/pkg/extension/middleware/access_logging_middleware.go
@@ -0,0 +1,196 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/extension -i Manager -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/extension"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements extension.Manager that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   extension.Manager
+}
+
+// AccessLoggingMiddleware instruments an implementation of the extension.Manager with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next extension.Manager) extension.Manager {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Action(ctx context.Context, in *extension.ActionRequest) (ap1 *extension.ActionResponse, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Action.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("in", in),
+	)
+
+	ap1, err = m.next.Action(ctx, in)
+
+	m.logger.Debug("Action.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("ap1", ap1),
+		zap.Error(err),
+	)
+
+	return ap1, err
+}
+
+func (m *accessLoggingMiddleware) Check(ctx context.Context, in *extension.CheckRequest) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Check.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("in", in),
+	)
+
+	err = m.next.Check(ctx, in)
+
+	m.logger.Debug("Check.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) GetDescriptor() (ep1 *extension.ExtensionDescriptor) {
+	begin := time.Now()
+
+	m.logger.Debug("GetDescriptor.Request")
+
+	ep1 = m.next.GetDescriptor()
+
+	m.logger.Debug("GetDescriptor.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("ep1", ep1),
+	)
+
+	return ep1
+}
+
+func (m *accessLoggingMiddleware) Install(ctx context.Context, in *extension.InstallRequest) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Install.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("in", in),
+	)
+
+	err = m.next.Install(ctx, in)
+
+	m.logger.Debug("Install.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) ListExtensions(ctx context.Context, space string, env string, filter *extension.ListExtensionsFilter) (ipa1 []*extension.Info, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("ListExtensions.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("space", space),
+		zap.Reflect("env", env),
+		zap.Reflect("filter", filter),
+	)
+
+	ipa1, err = m.next.ListExtensions(ctx, space, env, filter)
+
+	m.logger.Debug("ListExtensions.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("ipa1", ipa1),
+		zap.Error(err),
+	)
+
+	return ipa1, err
+}
+
+func (m *accessLoggingMiddleware) ListRegisteredExtensions(ctx context.Context, extensions ...string) (epa1 []*extension.ExtensionConnector, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("ListRegisteredExtensions.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("extensions", extensions),
+	)
+
+	epa1, err = m.next.ListRegisteredExtensions(ctx, extensions...)
+
+	m.logger.Debug("ListRegisteredExtensions.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("epa1", epa1),
+		zap.Error(err),
+	)
+
+	return epa1, err
+}
+
+func (m *accessLoggingMiddleware) RegisterExtensions(ctx context.Context, ext ...*extension.ExtensionConnector) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("RegisterExtensions.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("ext", ext),
+	)
+
+	err = m.next.RegisterExtensions(ctx, ext...)
+
+	m.logger.Debug("RegisterExtensions.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Uninstall(ctx context.Context, in *extension.UninstallRequest) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Uninstall.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("in", in),
+	)
+
+	err = m.next.Uninstall(ctx, in)
+
+	m.logger.Debug("Uninstall.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) UnregisterExtensions(ctx context.Context, ext ...*extension.ExtensionConnector) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("UnregisterExtensions.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("ext", ext),
+	)
+
+	err = m.next.UnregisterExtensions(ctx, ext...)
+
+	m.logger.Debug("UnregisterExtensions.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/pkg/extension/middleware/error_logging_middleware.go b/pkg/extension/middleware/error_logging_middleware.go
index e7dec72ba015ffe7e75a7bf0736f3a20cd7f4204..474003790010e858eed9fb9ac2af71f17fb35094 100644
--- a/pkg/extension/middleware/error_logging_middleware.go
+++ b/pkg/extension/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/extension -i Manager -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/extension/middleware/logging_middleware.go b/pkg/extension/middleware/logging_middleware.go
deleted file mode 100644
index 8ae37929d26a9dbccf40ab1030d73b708d3d96ba..0000000000000000000000000000000000000000
--- a/pkg/extension/middleware/logging_middleware.go
+++ /dev/null
@@ -1,354 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/extension -i Manager -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/extension"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements extension.Manager that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   extension.Manager
-}
-
-// LoggingMiddleware instruments an implementation of the extension.Manager with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next extension.Manager) extension.Manager {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Action(ctx context.Context, in *extension.ActionRequest) (ap1 *extension.ActionResponse, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"in":  in} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Action.Request", fields...)
-
-	ap1, err = m.next.Action(ctx, in)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"ap1": ap1,
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Action.Response", fields...)
-
-	return ap1, err
-}
-
-func (m *loggingMiddleware) Check(ctx context.Context, in *extension.CheckRequest) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"in":  in} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Check.Request", fields...)
-
-	err = m.next.Check(ctx, in)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Check.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) GetDescriptor() (ep1 *extension.ExtensionDescriptor) {
-	begin := time.Now()
-	var fields []zapcore.Field
-
-	m.logger.Debug("GetDescriptor.Request", fields...)
-
-	ep1 = m.next.GetDescriptor()
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"ep1": ep1} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("GetDescriptor.Response", fields...)
-
-	return ep1
-}
-
-func (m *loggingMiddleware) Install(ctx context.Context, in *extension.InstallRequest) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"in":  in} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Install.Request", fields...)
-
-	err = m.next.Install(ctx, in)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Install.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) ListExtensions(ctx context.Context, space string, env string, filter *extension.ListExtensionsFilter) (ipa1 []*extension.Info, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"space":  space,
-		"env":    env,
-		"filter": filter} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListExtensions.Request", fields...)
-
-	ipa1, err = m.next.ListExtensions(ctx, space, env, filter)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"ipa1": ipa1,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListExtensions.Response", fields...)
-
-	return ipa1, err
-}
-
-func (m *loggingMiddleware) ListRegisteredExtensions(ctx context.Context, extensions ...string) (epa1 []*extension.ExtensionConnector, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":        ctx,
-		"extensions": extensions} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListRegisteredExtensions.Request", fields...)
-
-	epa1, err = m.next.ListRegisteredExtensions(ctx, extensions...)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"epa1": epa1,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListRegisteredExtensions.Response", fields...)
-
-	return epa1, err
-}
-
-func (m *loggingMiddleware) RegisterExtensions(ctx context.Context, ext ...*extension.ExtensionConnector) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"ext": ext} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("RegisterExtensions.Request", fields...)
-
-	err = m.next.RegisterExtensions(ctx, ext...)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("RegisterExtensions.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Uninstall(ctx context.Context, in *extension.UninstallRequest) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"in":  in} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Uninstall.Request", fields...)
-
-	err = m.next.Uninstall(ctx, in)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Uninstall.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) UnregisterExtensions(ctx context.Context, ext ...*extension.ExtensionConnector) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"ext": ext} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("UnregisterExtensions.Request", fields...)
-
-	err = m.next.UnregisterExtensions(ctx, ext...)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("UnregisterExtensions.Response", fields...)
-
-	return err
-}
diff --git a/pkg/extension/middleware/middleware.go b/pkg/extension/middleware/middleware.go
index 52b8bff724419d007ece694ade348182a738ce82..f308b6a1d0af97853b6105788cd28977f6c637ac 100644
--- a/pkg/extension/middleware/middleware.go
+++ b/pkg/extension/middleware/middleware.go
@@ -1,10 +1,10 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/middleware
+// template: ../../../assets/templates/middleware/middleware.tmpl
 // gowrap: http://github.com/hexdigest/gowrap
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/extension -i Manager -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/extension -i Manager -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/extension"
@@ -17,12 +17,12 @@ func WithLog(s extension.Manager, logger *zap.Logger, log_access bool) extension
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Manager")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/extension/middleware/recovering_middleware.go b/pkg/extension/middleware/recovering_middleware.go
index d75af3364a31dd2e0961166a3a7dca573079f4e1..54b78da481917fda0d5614f6d9158c455d4d03e6 100644
--- a/pkg/extension/middleware/recovering_middleware.go
+++ b/pkg/extension/middleware/recovering_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/recovery
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/extension -i Manager -t ../../../assets/templates/middleware/recovery -o recovering_middleware.go -l ""
 
 import (
diff --git a/pkg/files/middleware/access_logging_middleware.go b/pkg/files/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..df932a8282989e17936438b66b714dd9b4b14df6
--- /dev/null
+++ b/pkg/files/middleware/access_logging_middleware.go
@@ -0,0 +1,163 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/files"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements files.Files that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   files.Files
+}
+
+// AccessLoggingMiddleware instruments an implementation of the files.Files with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next files.Files) files.Files {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) AbortUpload(ctx context.Context, upload *files.MultipartUpload) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("AbortUpload.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("upload", upload),
+	)
+
+	err = m.next.AbortUpload(ctx, upload)
+
+	m.logger.Debug("AbortUpload.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) CompleteUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("CompleteUpload.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("upload", upload),
+	)
+
+	u, err = m.next.CompleteUpload(ctx, upload)
+
+	m.logger.Debug("CompleteUpload.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("u", u),
+		zap.Error(err),
+	)
+
+	return u, err
+}
+
+func (m *accessLoggingMiddleware) DeleteFile(ctx context.Context, file *files.File) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("DeleteFile.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("file", file),
+	)
+
+	err = m.next.DeleteFile(ctx, file)
+
+	m.logger.Debug("DeleteFile.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) GetFile(ctx context.Context, file *files.File) (f *files.File, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("GetFile.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("file", file),
+	)
+
+	f, err = m.next.GetFile(ctx, file)
+
+	m.logger.Debug("GetFile.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("f", f),
+		zap.Error(err),
+	)
+
+	return f, err
+}
+
+func (m *accessLoggingMiddleware) MoveUpload(ctx context.Context, upload *files.MultipartUpload) (file *files.File, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("MoveUpload.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("upload", upload),
+	)
+
+	file, err = m.next.MoveUpload(ctx, upload)
+
+	m.logger.Debug("MoveUpload.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("file", file),
+		zap.Error(err),
+	)
+
+	return file, err
+}
+
+func (m *accessLoggingMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("StartUpload.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("upload", upload),
+	)
+
+	u, err = m.next.StartUpload(ctx, upload)
+
+	m.logger.Debug("StartUpload.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("u", u),
+		zap.Error(err),
+	)
+
+	return u, err
+}
+
+func (m *accessLoggingMiddleware) Upload(ctx context.Context, file *files.File) (u *files.Upload, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Upload.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("file", file),
+	)
+
+	u, err = m.next.Upload(ctx, file)
+
+	m.logger.Debug("Upload.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("u", u),
+		zap.Error(err),
+	)
+
+	return u, err
+}
diff --git a/pkg/files/middleware/logging_middleware.go b/pkg/files/middleware/logging_middleware.go
deleted file mode 100644
index b295fa68cc8367021d5fa5e00a0c850cc27c7cee..0000000000000000000000000000000000000000
--- a/pkg/files/middleware/logging_middleware.go
+++ /dev/null
@@ -1,291 +0,0 @@
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-package middleware
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/files"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements files.Files that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   files.Files
-}
-
-// LoggingMiddleware instruments an implementation of the files.Files with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next files.Files) files.Files {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) AbortUpload(ctx context.Context, upload *files.MultipartUpload) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"upload": upload} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("AbortUpload.Request", fields...)
-
-	err = m.next.AbortUpload(ctx, upload)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("AbortUpload.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) CompleteUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"upload": upload} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("CompleteUpload.Request", fields...)
-
-	u, err = m.next.CompleteUpload(ctx, upload)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"u":   u,
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("CompleteUpload.Response", fields...)
-
-	return u, err
-}
-
-func (m *loggingMiddleware) DeleteFile(ctx context.Context, file *files.File) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":  ctx,
-		"file": file} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("DeleteFile.Request", fields...)
-
-	err = m.next.DeleteFile(ctx, file)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("DeleteFile.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) GetFile(ctx context.Context, file *files.File) (f *files.File, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":  ctx,
-		"file": file} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("GetFile.Request", fields...)
-
-	f, err = m.next.GetFile(ctx, file)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"f":   f,
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("GetFile.Response", fields...)
-
-	return f, err
-}
-
-func (m *loggingMiddleware) MoveUpload(ctx context.Context, upload *files.MultipartUpload) (file *files.File, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"upload": upload} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("MoveUpload.Request", fields...)
-
-	file, err = m.next.MoveUpload(ctx, upload)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"file": file,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("MoveUpload.Response", fields...)
-
-	return file, err
-}
-
-func (m *loggingMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"upload": upload} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("StartUpload.Request", fields...)
-
-	u, err = m.next.StartUpload(ctx, upload)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"u":   u,
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("StartUpload.Response", fields...)
-
-	return u, err
-}
-
-func (m *loggingMiddleware) Upload(ctx context.Context, file *files.File) (u *files.Upload, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":  ctx,
-		"file": file} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Upload.Request", fields...)
-
-	u, err = m.next.Upload(ctx, file)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"u":   u,
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Upload.Response", fields...)
-
-	return u, err
-}
diff --git a/pkg/files/middleware/middleware.go b/pkg/files/middleware/middleware.go
index 39c64f8764e904b53fcce18bf8b990424ad03149..68d4c21f67b202f8639963930c71dcd6ab1cc3f9 100644
--- a/pkg/files/middleware/middleware.go
+++ b/pkg/files/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/files -i Files -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/files"
@@ -17,12 +17,12 @@ func WithLog(s files.Files, logger *zap.Logger, log_access bool) files.Files {
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Files")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/invitations/middleware/access_logging_middleware.go b/pkg/invitations/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..24a854995bed29e849ccf873f41ccd1af073cb69
--- /dev/null
+++ b/pkg/invitations/middleware/access_logging_middleware.go
@@ -0,0 +1,129 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/invitations -i Invitations -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/invitations"
+	"git.perx.ru/perxis/perxis-go/pkg/options"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements invitations.Invitations that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   invitations.Invitations
+}
+
+// AccessLoggingMiddleware instruments an implementation of the invitations.Invitations with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next invitations.Invitations) invitations.Invitations {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Accept(ctx context.Context, invitationId string, userId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Accept.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("invitationId", invitationId),
+		zap.Reflect("userId", userId),
+	)
+
+	err = m.next.Accept(ctx, invitationId, userId)
+
+	m.logger.Debug("Accept.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Create(ctx context.Context, invitation *invitations.Invitation) (created *invitations.Invitation, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Create.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("invitation", invitation),
+	)
+
+	created, err = m.next.Create(ctx, invitation)
+
+	m.logger.Debug("Create.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("created", created),
+		zap.Error(err),
+	)
+
+	return created, err
+}
+
+func (m *accessLoggingMiddleware) Delete(ctx context.Context, invitationId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Delete.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("invitationId", invitationId),
+	)
+
+	err = m.next.Delete(ctx, invitationId)
+
+	m.logger.Debug("Delete.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Find(ctx context.Context, filter *invitations.Filter, opts *options.FindOptions) (invitations []*invitations.Invitation, total int, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Find.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("filter", filter),
+		zap.Reflect("opts", opts),
+	)
+
+	invitations, total, err = m.next.Find(ctx, filter, opts)
+
+	m.logger.Debug("Find.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("invitations", invitations),
+		zap.Reflect("total", total),
+		zap.Error(err),
+	)
+
+	return invitations, total, err
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, invitationId string) (invitation *invitations.Invitation, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("invitationId", invitationId),
+	)
+
+	invitation, err = m.next.Get(ctx, invitationId)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("invitation", invitation),
+		zap.Error(err),
+	)
+
+	return invitation, err
+}
diff --git a/pkg/invitations/middleware/error_logging_middleware.go b/pkg/invitations/middleware/error_logging_middleware.go
index ab0a2122f23c660281716d5dbc697cc6e13de3fe..da6603acdda802808abac634896ceb7d3b92cd1b 100644
--- a/pkg/invitations/middleware/error_logging_middleware.go
+++ b/pkg/invitations/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/invitations -i Invitations -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/invitations/middleware/logging_middleware.go b/pkg/invitations/middleware/logging_middleware.go
deleted file mode 100644
index ac358b3e1e635bc7f410d5b6a318b4eddc231d38..0000000000000000000000000000000000000000
--- a/pkg/invitations/middleware/logging_middleware.go
+++ /dev/null
@@ -1,221 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/invitations -i Invitations -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/invitations"
-	"git.perx.ru/perxis/perxis-go/pkg/options"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements invitations.Invitations that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   invitations.Invitations
-}
-
-// LoggingMiddleware instruments an implementation of the invitations.Invitations with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next invitations.Invitations) invitations.Invitations {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Accept(ctx context.Context, invitationId string, userId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":          ctx,
-		"invitationId": invitationId,
-		"userId":       userId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Accept.Request", fields...)
-
-	err = m.next.Accept(ctx, invitationId, userId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Accept.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Create(ctx context.Context, invitation *invitations.Invitation) (created *invitations.Invitation, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":        ctx,
-		"invitation": invitation} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Request", fields...)
-
-	created, err = m.next.Create(ctx, invitation)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"created": created,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Response", fields...)
-
-	return created, err
-}
-
-func (m *loggingMiddleware) Delete(ctx context.Context, invitationId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":          ctx,
-		"invitationId": invitationId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Request", fields...)
-
-	err = m.next.Delete(ctx, invitationId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Find(ctx context.Context, filter *invitations.Filter, opts *options.FindOptions) (invitations []*invitations.Invitation, total int, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"filter": filter,
-		"opts":   opts} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Find.Request", fields...)
-
-	invitations, total, err = m.next.Find(ctx, filter, opts)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"invitations": invitations,
-		"total":       total,
-		"err":         err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Find.Response", fields...)
-
-	return invitations, total, err
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, invitationId string) (invitation *invitations.Invitation, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":          ctx,
-		"invitationId": invitationId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	invitation, err = m.next.Get(ctx, invitationId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"invitation": invitation,
-		"err":        err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return invitation, err
-}
diff --git a/pkg/invitations/middleware/middleware.go b/pkg/invitations/middleware/middleware.go
index d4a336ba62cdbef2da5a06e4d71ecdf20491fe49..f59604ba948ade1b4fe03bc3e3cadd8de6f7cfcd 100644
--- a/pkg/invitations/middleware/middleware.go
+++ b/pkg/invitations/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/invitations -i Invitations -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/invitations -i Invitations -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/invitations"
@@ -17,12 +17,12 @@ func WithLog(s invitations.Invitations, logger *zap.Logger, log_access bool) inv
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Invitations")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/items/middleware/logging_middleware.go b/pkg/items/middleware/logging_middleware.go
index 7b310b3304fc9c0f5b73995fdf4e369259ffc671..fe7870a831d9b90a6145ad20f4c55cb602e8ed98 100644
--- a/pkg/items/middleware/logging_middleware.go
+++ b/pkg/items/middleware/logging_middleware.go
@@ -45,7 +45,7 @@ func (m *loggingMiddleware) AggregatePublished(ctx context.Context, spaceId stri
 
 	result, err = m.next.AggregatePublished(ctx, spaceId, envId, collectionId, filter, options...)
 	if err != nil {
-		logger.Error("Failed to aggregate_published", zap.Error(err))
+		logger.Error("Failed to aggregate published", zap.Error(err))
 		return
 	}
 
@@ -124,7 +124,7 @@ func (m *loggingMiddleware) FindArchived(ctx context.Context, spaceId string, en
 
 	items, total, err = m.next.FindArchived(ctx, spaceId, envId, collectionId, filter, options...)
 	if err != nil {
-		logger.Error("Failed to find_archived", zap.Error(err))
+		logger.Error("Failed to find archived", zap.Error(err))
 		return
 	}
 
@@ -138,7 +138,7 @@ func (m *loggingMiddleware) FindPublished(ctx context.Context, spaceId string, e
 
 	items, total, err = m.next.FindPublished(ctx, spaceId, envId, collectionId, filter, options...)
 	if err != nil {
-		logger.Error("Failed to findpublished", zap.Error(err))
+		logger.Error("Failed to find published", zap.Error(err))
 		return
 	}
 
diff --git a/pkg/items/middleware/middleware.go b/pkg/items/middleware/middleware.go
index 2ce07ef94ff532af1ed3353ef5bdba6e5f6871aa..4ef6a1fd2a0e2aec25d759d75d2e40d699ad7e06 100644
--- a/pkg/items/middleware/middleware.go
+++ b/pkg/items/middleware/middleware.go
@@ -22,6 +22,7 @@ func WithLog(s items.Items, logger *zap.Logger, log_access bool) items.Items {
 		s = AccessLoggingMiddleware(logger)(s)
 	}
 	s = LoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/locales/middleware/access_logging_middleware.go b/pkg/locales/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..eabb71c37756d0a7d39d6abe217f394036a69922
--- /dev/null
+++ b/pkg/locales/middleware/access_logging_middleware.go
@@ -0,0 +1,89 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/locales -i Locales -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/locales"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements locales.Locales that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   locales.Locales
+}
+
+// AccessLoggingMiddleware instruments an implementation of the locales.Locales with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next locales.Locales) locales.Locales {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Create(ctx context.Context, locale *locales.Locale) (created *locales.Locale, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Create.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("locale", locale),
+	)
+
+	created, err = m.next.Create(ctx, locale)
+
+	m.logger.Debug("Create.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("created", created),
+		zap.Error(err),
+	)
+
+	return created, err
+}
+
+func (m *accessLoggingMiddleware) Delete(ctx context.Context, spaceId string, localeId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Delete.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("localeId", localeId),
+	)
+
+	err = m.next.Delete(ctx, spaceId, localeId)
+
+	m.logger.Debug("Delete.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) List(ctx context.Context, spaceId string) (locales []*locales.Locale, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("List.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+	)
+
+	locales, err = m.next.List(ctx, spaceId)
+
+	m.logger.Debug("List.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("locales", locales),
+		zap.Error(err),
+	)
+
+	return locales, err
+}
diff --git a/pkg/locales/middleware/error_logging_middleware.go b/pkg/locales/middleware/error_logging_middleware.go
index 3251fc7c972217ca4480ecbc26cb65cc055504ea..a00f23a29aa8b5330e1097c670e6cc0edf5b9983 100644
--- a/pkg/locales/middleware/error_logging_middleware.go
+++ b/pkg/locales/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/locales -i Locales -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/locales/middleware/logging_middleware.go b/pkg/locales/middleware/logging_middleware.go
deleted file mode 100644
index 2db3ef39beb37cabf73adbfb9a3e1122f9e85387..0000000000000000000000000000000000000000
--- a/pkg/locales/middleware/logging_middleware.go
+++ /dev/null
@@ -1,145 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/locales -i Locales -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/locales"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements locales.Locales that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   locales.Locales
-}
-
-// LoggingMiddleware instruments an implementation of the locales.Locales with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next locales.Locales) locales.Locales {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Create(ctx context.Context, locale *locales.Locale) (created *locales.Locale, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"locale": locale} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Request", fields...)
-
-	created, err = m.next.Create(ctx, locale)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"created": created,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Response", fields...)
-
-	return created, err
-}
-
-func (m *loggingMiddleware) Delete(ctx context.Context, spaceId string, localeId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":      ctx,
-		"spaceId":  spaceId,
-		"localeId": localeId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Request", fields...)
-
-	err = m.next.Delete(ctx, spaceId, localeId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) List(ctx context.Context, spaceId string) (locales []*locales.Locale, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Request", fields...)
-
-	locales, err = m.next.List(ctx, spaceId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"locales": locales,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Response", fields...)
-
-	return locales, err
-}
diff --git a/pkg/locales/middleware/middleware.go b/pkg/locales/middleware/middleware.go
index 721829405e98efc0c47e75f8670f4e74b784998d..2598e397afafb552c16be249cfcf1ed62149339b 100644
--- a/pkg/locales/middleware/middleware.go
+++ b/pkg/locales/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/locales -i Locales -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/locales -i Locales -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/locales"
@@ -17,12 +17,12 @@ func WithLog(s locales.Locales, logger *zap.Logger, log_access bool) locales.Loc
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Locales")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/members/middleware/access_logging_middleware.go b/pkg/members/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..0a062331a51f9f93d0d7c877637636d3640ef8a7
--- /dev/null
+++ b/pkg/members/middleware/access_logging_middleware.go
@@ -0,0 +1,147 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members -i Members -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/members"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements members.Members that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   members.Members
+}
+
+// AccessLoggingMiddleware instruments an implementation of the members.Members with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next members.Members) members.Members {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, orgId string, userId string) (role members.Role, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("orgId", orgId),
+		zap.Reflect("userId", userId),
+	)
+
+	role, err = m.next.Get(ctx, orgId, userId)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("role", role),
+		zap.Error(err),
+	)
+
+	return role, err
+}
+
+func (m *accessLoggingMiddleware) ListMembers(ctx context.Context, orgId string) (members []*members.Member, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("ListMembers.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("orgId", orgId),
+	)
+
+	members, err = m.next.ListMembers(ctx, orgId)
+
+	m.logger.Debug("ListMembers.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("members", members),
+		zap.Error(err),
+	)
+
+	return members, err
+}
+
+func (m *accessLoggingMiddleware) ListOrganizations(ctx context.Context, userId string) (organizations []*members.Member, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("ListOrganizations.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("userId", userId),
+	)
+
+	organizations, err = m.next.ListOrganizations(ctx, userId)
+
+	m.logger.Debug("ListOrganizations.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("organizations", organizations),
+		zap.Error(err),
+	)
+
+	return organizations, err
+}
+
+func (m *accessLoggingMiddleware) Remove(ctx context.Context, orgId string, userId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Remove.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("orgId", orgId),
+		zap.Reflect("userId", userId),
+	)
+
+	err = m.next.Remove(ctx, orgId, userId)
+
+	m.logger.Debug("Remove.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) RemoveAll(ctx context.Context, orgId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("RemoveAll.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("orgId", orgId),
+	)
+
+	err = m.next.RemoveAll(ctx, orgId)
+
+	m.logger.Debug("RemoveAll.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Set(ctx context.Context, orgId string, userId string, role members.Role) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Set.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("orgId", orgId),
+		zap.Reflect("userId", userId),
+		zap.Reflect("role", role),
+	)
+
+	err = m.next.Set(ctx, orgId, userId, role)
+
+	m.logger.Debug("Set.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/pkg/members/middleware/error_logging_middleware.go b/pkg/members/middleware/error_logging_middleware.go
index 79a92a1f2ac6f3d5854fcdf6c1f709e21ee160a7..d3c1a594983ac1bf25a8a397c12580d445b063b6 100644
--- a/pkg/members/middleware/error_logging_middleware.go
+++ b/pkg/members/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members -i Members -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/members/middleware/logging_middleware.go b/pkg/members/middleware/logging_middleware.go
deleted file mode 100644
index 3136597a451cc8938c4dc326b01b9e022658293e..0000000000000000000000000000000000000000
--- a/pkg/members/middleware/logging_middleware.go
+++ /dev/null
@@ -1,257 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members -i Members -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/members"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements members.Members that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   members.Members
-}
-
-// LoggingMiddleware instruments an implementation of the members.Members with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next members.Members) members.Members {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, orgId string, userId string) (role members.Role, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"orgId":  orgId,
-		"userId": userId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	role, err = m.next.Get(ctx, orgId, userId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"role": role,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return role, err
-}
-
-func (m *loggingMiddleware) ListMembers(ctx context.Context, orgId string) (members []*members.Member, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":   ctx,
-		"orgId": orgId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListMembers.Request", fields...)
-
-	members, err = m.next.ListMembers(ctx, orgId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"members": members,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListMembers.Response", fields...)
-
-	return members, err
-}
-
-func (m *loggingMiddleware) ListOrganizations(ctx context.Context, userId string) (organizations []*members.Member, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"userId": userId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListOrganizations.Request", fields...)
-
-	organizations, err = m.next.ListOrganizations(ctx, userId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"organizations": organizations,
-		"err":           err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListOrganizations.Response", fields...)
-
-	return organizations, err
-}
-
-func (m *loggingMiddleware) Remove(ctx context.Context, orgId string, userId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"orgId":  orgId,
-		"userId": userId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Remove.Request", fields...)
-
-	err = m.next.Remove(ctx, orgId, userId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Remove.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) RemoveAll(ctx context.Context, orgId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":   ctx,
-		"orgId": orgId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("RemoveAll.Request", fields...)
-
-	err = m.next.RemoveAll(ctx, orgId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("RemoveAll.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Set(ctx context.Context, orgId string, userId string, role members.Role) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"orgId":  orgId,
-		"userId": userId,
-		"role":   role} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Set.Request", fields...)
-
-	err = m.next.Set(ctx, orgId, userId, role)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Set.Response", fields...)
-
-	return err
-}
diff --git a/pkg/members/middleware/middleware.go b/pkg/members/middleware/middleware.go
index 517bfa624a35e247d1e93f44db75a5eccaf0c721..bb491623865e21496adedb1e91987bc2205a3ce4 100644
--- a/pkg/members/middleware/middleware.go
+++ b/pkg/members/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/members -i Members -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members -i Members -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/members"
@@ -17,12 +17,12 @@ func WithLog(s members.Members, logger *zap.Logger, log_access bool) members.Mem
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Members")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/members/observer/middleware/access_logging_middleware.go b/pkg/members/observer/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..48e9da969978baf7abdad1ae3c9a92582f56d299
--- /dev/null
+++ b/pkg/members/observer/middleware/access_logging_middleware.go
@@ -0,0 +1,52 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members/observer -i Observer -t ../../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/collaborators"
+	"git.perx.ru/perxis/perxis-go/pkg/members/observer"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements observer.Observer that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   observer.Observer
+}
+
+// AccessLoggingMiddleware instruments an implementation of the observer.Observer with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next observer.Observer) observer.Observer {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) OnCollaboratorSet(ctx context.Context, collaborator *collaborators.Collaborator) (delayedTaskID string, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("OnCollaboratorSet.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("collaborator", collaborator),
+	)
+
+	delayedTaskID, err = m.next.OnCollaboratorSet(ctx, collaborator)
+
+	m.logger.Debug("OnCollaboratorSet.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("delayedTaskID", delayedTaskID),
+		zap.Error(err),
+	)
+
+	return delayedTaskID, err
+}
diff --git a/pkg/members/observer/middleware/error_logging_middleware.go b/pkg/members/observer/middleware/error_logging_middleware.go
index b7184b475d626a0f4a2a53cd427a672841b38249..462eff251d5aec0648d4ef7e8d60e200896cbe6e 100644
--- a/pkg/members/observer/middleware/error_logging_middleware.go
+++ b/pkg/members/observer/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members/observer -i Observer -t ../../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/members/observer/middleware/logging_middleware.go b/pkg/members/observer/middleware/logging_middleware.go
deleted file mode 100644
index 09f203fd21f3a3d2ecabd3279c3d1ca2a323194d..0000000000000000000000000000000000000000
--- a/pkg/members/observer/middleware/logging_middleware.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members/observer -i Observer -t ../../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/collaborators"
-	"git.perx.ru/perxis/perxis-go/pkg/members/observer"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements observer.Observer that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   observer.Observer
-}
-
-// LoggingMiddleware instruments an implementation of the observer.Observer with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next observer.Observer) observer.Observer {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) OnCollaboratorSet(ctx context.Context, collaborator *collaborators.Collaborator) (delayedTaskID string, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":          ctx,
-		"collaborator": collaborator} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("OnCollaboratorSet.Request", fields...)
-
-	delayedTaskID, err = m.next.OnCollaboratorSet(ctx, collaborator)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"delayedTaskID": delayedTaskID,
-		"err":           err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("OnCollaboratorSet.Response", fields...)
-
-	return delayedTaskID, err
-}
diff --git a/pkg/members/observer/middleware/middleware.go b/pkg/members/observer/middleware/middleware.go
index f68b58c7398b341f8f3850ddb96538027a58d354..ba2dff4fee8f9ad426d951d518c18e07dc05134e 100644
--- a/pkg/members/observer/middleware/middleware.go
+++ b/pkg/members/observer/middleware/middleware.go
@@ -1,10 +1,10 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
-// template: ../../../../assets/templates/middleware/middleware
+// template: ../../../../assets/templates/middleware/middleware.tmpl
 // gowrap: http://github.com/hexdigest/gowrap
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members/observer -i Observer -t ../../../../assets/templates/middleware/middleware -o middleware.go -l ""
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members/observer -i Observer -t ../../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/members/observer"
@@ -17,12 +17,12 @@ func WithLog(s observer.Observer, logger *zap.Logger, log_access bool) observer.
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Observer")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/members/observer/middleware/recovering_middleware.go b/pkg/members/observer/middleware/recovering_middleware.go
index bd576ecd2699dea927925b935bc024630420f997..f4d96995ded61101fde4a8faabf21da84000f1fb 100644
--- a/pkg/members/observer/middleware/recovering_middleware.go
+++ b/pkg/members/observer/middleware/recovering_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../../assets/templates/middleware/recovery
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/members/observer -i Observer -t ../../../../assets/templates/middleware/recovery -o recovering_middleware.go -l ""
 
 import (
diff --git a/pkg/organizations/middleware/access_logging_middleware.go b/pkg/organizations/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..be6e937d1dc76ba9a6d4d80acd5c6343e35eacd7
--- /dev/null
+++ b/pkg/organizations/middleware/access_logging_middleware.go
@@ -0,0 +1,128 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/organizations -i Organizations -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/options"
+	"git.perx.ru/perxis/perxis-go/pkg/organizations"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements organizations.Organizations that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   organizations.Organizations
+}
+
+// AccessLoggingMiddleware instruments an implementation of the organizations.Organizations with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next organizations.Organizations) organizations.Organizations {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Create(ctx context.Context, org *organizations.Organization) (created *organizations.Organization, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Create.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("org", org),
+	)
+
+	created, err = m.next.Create(ctx, org)
+
+	m.logger.Debug("Create.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("created", created),
+		zap.Error(err),
+	)
+
+	return created, err
+}
+
+func (m *accessLoggingMiddleware) Delete(ctx context.Context, orgId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Delete.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("orgId", orgId),
+	)
+
+	err = m.next.Delete(ctx, orgId)
+
+	m.logger.Debug("Delete.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Find(ctx context.Context, filter *organizations.Filter, opts *options.FindOptions) (orgs []*organizations.Organization, total int, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Find.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("filter", filter),
+		zap.Reflect("opts", opts),
+	)
+
+	orgs, total, err = m.next.Find(ctx, filter, opts)
+
+	m.logger.Debug("Find.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("orgs", orgs),
+		zap.Reflect("total", total),
+		zap.Error(err),
+	)
+
+	return orgs, total, err
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, orgId string) (org *organizations.Organization, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("orgId", orgId),
+	)
+
+	org, err = m.next.Get(ctx, orgId)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("org", org),
+		zap.Error(err),
+	)
+
+	return org, err
+}
+
+func (m *accessLoggingMiddleware) Update(ctx context.Context, org *organizations.Organization) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Update.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("org", org),
+	)
+
+	err = m.next.Update(ctx, org)
+
+	m.logger.Debug("Update.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/pkg/organizations/middleware/error_logging_middleware.go b/pkg/organizations/middleware/error_logging_middleware.go
index 1ededdd2a8f391c56909cc33ec799175380a939a..2d6db8198b885e157ba8ebcc855bb6d9dadb519c 100644
--- a/pkg/organizations/middleware/error_logging_middleware.go
+++ b/pkg/organizations/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/organizations -i Organizations -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/organizations/middleware/logging_middleware.go b/pkg/organizations/middleware/logging_middleware.go
deleted file mode 100644
index b1e6bc3b914ea49d0781d7ae39ddcc5c795fff45..0000000000000000000000000000000000000000
--- a/pkg/organizations/middleware/logging_middleware.go
+++ /dev/null
@@ -1,220 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/organizations -i Organizations -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/options"
-	"git.perx.ru/perxis/perxis-go/pkg/organizations"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements organizations.Organizations that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   organizations.Organizations
-}
-
-// LoggingMiddleware instruments an implementation of the organizations.Organizations with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next organizations.Organizations) organizations.Organizations {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Create(ctx context.Context, org *organizations.Organization) (created *organizations.Organization, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"org": org} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Request", fields...)
-
-	created, err = m.next.Create(ctx, org)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"created": created,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Response", fields...)
-
-	return created, err
-}
-
-func (m *loggingMiddleware) Delete(ctx context.Context, orgId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":   ctx,
-		"orgId": orgId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Request", fields...)
-
-	err = m.next.Delete(ctx, orgId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Find(ctx context.Context, filter *organizations.Filter, opts *options.FindOptions) (orgs []*organizations.Organization, total int, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"filter": filter,
-		"opts":   opts} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Find.Request", fields...)
-
-	orgs, total, err = m.next.Find(ctx, filter, opts)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"orgs":  orgs,
-		"total": total,
-		"err":   err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Find.Response", fields...)
-
-	return orgs, total, err
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, orgId string) (org *organizations.Organization, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":   ctx,
-		"orgId": orgId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	org, err = m.next.Get(ctx, orgId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"org": org,
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return org, err
-}
-
-func (m *loggingMiddleware) Update(ctx context.Context, org *organizations.Organization) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx": ctx,
-		"org": org} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Request", fields...)
-
-	err = m.next.Update(ctx, org)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Response", fields...)
-
-	return err
-}
diff --git a/pkg/organizations/middleware/middleware.go b/pkg/organizations/middleware/middleware.go
index f6cf5c5527ede8c7d285cc280642ca6aa420970c..906a4c356b434fa2926a3e970bf0f32d0c0fa936 100644
--- a/pkg/organizations/middleware/middleware.go
+++ b/pkg/organizations/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/organizations -i Organizations -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/organizations -i Organizations -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/organizations"
@@ -17,12 +17,12 @@ func WithLog(s organizations.Organizations, logger *zap.Logger, log_access bool)
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Organizations")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/references/middleware/access_logging_middleware.go b/pkg/references/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..c628dc11fccc175b91f0ed7fdc7f180e3a91bfb4
--- /dev/null
+++ b/pkg/references/middleware/access_logging_middleware.go
@@ -0,0 +1,80 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/items"
+	"git.perx.ru/perxis/perxis-go/pkg/references"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements references.References that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   references.References
+}
+
+// AccessLoggingMiddleware instruments an implementation of the references.References with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next references.References) references.References {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, spaceId string, envId string, references []*references.Reference) (items []*items.Item, notfound []*references.Reference, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("envId", envId),
+		zap.Reflect("references", references),
+	)
+
+	items, notfound, err = m.next.Get(ctx, spaceId, envId, references)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("items", items),
+		zap.Reflect("notfound", notfound),
+		zap.Error(err),
+	)
+
+	return items, notfound, err
+}
+
+func (m *accessLoggingMiddleware) Publish(ctx context.Context, spaceId string, envId string, references []*references.Reference, recursive bool, force bool) (published []*references.Reference, notfound []*references.Reference, unpublished []*references.Reference, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Publish.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("envId", envId),
+		zap.Reflect("references", references),
+		zap.Reflect("recursive", recursive),
+		zap.Reflect("force", force),
+	)
+
+	published, notfound, unpublished, err = m.next.Publish(ctx, spaceId, envId, references, recursive, force)
+
+	m.logger.Debug("Publish.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("published", published),
+		zap.Reflect("notfound", notfound),
+		zap.Reflect("unpublished", unpublished),
+		zap.Error(err),
+	)
+
+	return published, notfound, unpublished, err
+}
diff --git a/pkg/references/middleware/error_logging_middleware.go b/pkg/references/middleware/error_logging_middleware.go
index 0cfbf919e5acd70dc453494d15e9e8778afcca85..b55b11679d819e42f30234d27f6f140b2d024aa8 100644
--- a/pkg/references/middleware/error_logging_middleware.go
+++ b/pkg/references/middleware/error_logging_middleware.go
@@ -1,10 +1,10 @@
-package middleware
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/error_log
+// gowrap: http://github.com/hexdigest/gowrap
 
-// DO NOT EDIT!
-// This code is generated with http://github.com/hexdigest/gowrap tool
-// using ../../../assets/templates/middleware/error_log template
+package middleware
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
 	"context"
diff --git a/pkg/references/middleware/logging_middleware.go b/pkg/references/middleware/logging_middleware.go
deleted file mode 100644
index a0f010ae99c2f9ce1eb726e5caba316379328a42..0000000000000000000000000000000000000000
--- a/pkg/references/middleware/logging_middleware.go
+++ /dev/null
@@ -1,118 +0,0 @@
-package middleware
-
-// DO NOT EDIT!
-// This code is generated with http://github.com/hexdigest/gowrap tool
-// using ../../../assets/templates/middleware/access_log template
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/access_log -o logging_middleware.go
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/items"
-	"git.perx.ru/perxis/perxis-go/pkg/references"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements references.References that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   references.References
-}
-
-// LoggingMiddleware instruments an implementation of the references.References with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next references.References) references.References {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, spaceId string, envId string, references []*references.Reference) (items []*items.Item, notfound []*references.Reference, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":        ctx,
-		"spaceId":    spaceId,
-		"envId":      envId,
-		"references": references} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	items, notfound, err = m.next.Get(ctx, spaceId, envId, references)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"items":    items,
-		"notfound": notfound,
-		"err":      err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return items, notfound, err
-}
-
-func (m *loggingMiddleware) Publish(ctx context.Context, spaceId string, envId string, references []*references.Reference, recursive bool, force bool) (published []*references.Reference, notfound []*references.Reference, unpublished []*references.Reference, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":        ctx,
-		"spaceId":    spaceId,
-		"envId":      envId,
-		"references": references,
-		"recursive":  recursive,
-		"force":      force} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Publish.Request", fields...)
-
-	published, notfound, unpublished, err = m.next.Publish(ctx, spaceId, envId, references, recursive, force)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"published":   published,
-		"notfound":    notfound,
-		"unpublished": unpublished,
-		"err":         err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Publish.Response", fields...)
-
-	return published, notfound, unpublished, err
-}
diff --git a/pkg/references/middleware/middleware.go b/pkg/references/middleware/middleware.go
index 6bd830146952e16ccabf780230d03dc6b9473a74..529a61b60265f0f77bc0a4a3be38151f7ba5334e 100644
--- a/pkg/references/middleware/middleware.go
+++ b/pkg/references/middleware/middleware.go
@@ -1,10 +1,10 @@
-package middleware
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/middleware.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
 
-// DO NOT EDIT!
-// This code is generated with http://github.com/hexdigest/gowrap tool
-// using ../../../assets/templates/middleware/middleware template
+package middleware
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/middleware -o middleware.go
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/references"
@@ -17,12 +17,12 @@ func WithLog(s references.References, logger *zap.Logger, log_access bool) refer
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("References")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/references/middleware/recovering_middleware.go b/pkg/references/middleware/recovering_middleware.go
index 070d9d22fca08a8394362b8eea6a31628d56902c..1331a96787b8ba98322ab2e4ee5764d296504066 100644
--- a/pkg/references/middleware/recovering_middleware.go
+++ b/pkg/references/middleware/recovering_middleware.go
@@ -1,10 +1,10 @@
-package middleware
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/recovery
+// gowrap: http://github.com/hexdigest/gowrap
 
-// DO NOT EDIT!
-// This code is generated with http://github.com/hexdigest/gowrap tool
-// using ../../../assets/templates/middleware/recovery template
+package middleware
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/recovery -o recovering_middleware.go
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/recovery -o recovering_middleware.go -l ""
 
 import (
 	"context"
diff --git a/pkg/roles/middleware/access_logging_middleware.go b/pkg/roles/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..310cdeda7c585c571263bebb6c42739a8d3074de
--- /dev/null
+++ b/pkg/roles/middleware/access_logging_middleware.go
@@ -0,0 +1,127 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/roles -i Roles -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/roles"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements roles.Roles that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   roles.Roles
+}
+
+// AccessLoggingMiddleware instruments an implementation of the roles.Roles with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next roles.Roles) roles.Roles {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Create(ctx context.Context, role *roles.Role) (created *roles.Role, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Create.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("role", role),
+	)
+
+	created, err = m.next.Create(ctx, role)
+
+	m.logger.Debug("Create.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("created", created),
+		zap.Error(err),
+	)
+
+	return created, err
+}
+
+func (m *accessLoggingMiddleware) Delete(ctx context.Context, spaceId string, roleId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Delete.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("roleId", roleId),
+	)
+
+	err = m.next.Delete(ctx, spaceId, roleId)
+
+	m.logger.Debug("Delete.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, spaceId string, roleId string) (role *roles.Role, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("roleId", roleId),
+	)
+
+	role, err = m.next.Get(ctx, spaceId, roleId)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("role", role),
+		zap.Error(err),
+	)
+
+	return role, err
+}
+
+func (m *accessLoggingMiddleware) List(ctx context.Context, spaceId string) (roles []*roles.Role, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("List.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+	)
+
+	roles, err = m.next.List(ctx, spaceId)
+
+	m.logger.Debug("List.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("roles", roles),
+		zap.Error(err),
+	)
+
+	return roles, err
+}
+
+func (m *accessLoggingMiddleware) Update(ctx context.Context, role *roles.Role) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Update.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("role", role),
+	)
+
+	err = m.next.Update(ctx, role)
+
+	m.logger.Debug("Update.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/pkg/roles/middleware/error_logging_middleware.go b/pkg/roles/middleware/error_logging_middleware.go
index 48f12c3d6416ade72e1567c976e78b6237a3d323..bb6073d11fef1d2763ca85855274edf4a8c71839 100644
--- a/pkg/roles/middleware/error_logging_middleware.go
+++ b/pkg/roles/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/roles -i Roles -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/roles/middleware/logging_middleware.go b/pkg/roles/middleware/logging_middleware.go
deleted file mode 100644
index 31d9d49245bd64eb0e2ba542e54e32f01805d007..0000000000000000000000000000000000000000
--- a/pkg/roles/middleware/logging_middleware.go
+++ /dev/null
@@ -1,219 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/roles -i Roles -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/roles"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements roles.Roles that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   roles.Roles
-}
-
-// LoggingMiddleware instruments an implementation of the roles.Roles with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next roles.Roles) roles.Roles {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Create(ctx context.Context, role *roles.Role) (created *roles.Role, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":  ctx,
-		"role": role} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Request", fields...)
-
-	created, err = m.next.Create(ctx, role)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"created": created,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Response", fields...)
-
-	return created, err
-}
-
-func (m *loggingMiddleware) Delete(ctx context.Context, spaceId string, roleId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"roleId":  roleId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Request", fields...)
-
-	err = m.next.Delete(ctx, spaceId, roleId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, spaceId string, roleId string) (role *roles.Role, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"roleId":  roleId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	role, err = m.next.Get(ctx, spaceId, roleId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"role": role,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return role, err
-}
-
-func (m *loggingMiddleware) List(ctx context.Context, spaceId string) (roles []*roles.Role, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Request", fields...)
-
-	roles, err = m.next.List(ctx, spaceId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"roles": roles,
-		"err":   err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Response", fields...)
-
-	return roles, err
-}
-
-func (m *loggingMiddleware) Update(ctx context.Context, role *roles.Role) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":  ctx,
-		"role": role} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Request", fields...)
-
-	err = m.next.Update(ctx, role)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Response", fields...)
-
-	return err
-}
diff --git a/pkg/roles/middleware/middleware.go b/pkg/roles/middleware/middleware.go
index 6b1a8b16e0178a22a57a6f44226aa32c6dacf4eb..aaeb2da895d5aa71768e577315e549daa6a247c4 100644
--- a/pkg/roles/middleware/middleware.go
+++ b/pkg/roles/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/roles -i Roles -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/roles -i Roles -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/roles"
@@ -17,12 +17,12 @@ func WithLog(s roles.Roles, logger *zap.Logger, log_access bool) roles.Roles {
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Roles")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/spaces/middleware/access_logging_middleware.go b/pkg/spaces/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..7fca51ede8a87ba31ceb7293537e32c2db4c08d7
--- /dev/null
+++ b/pkg/spaces/middleware/access_logging_middleware.go
@@ -0,0 +1,219 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/spaces -i Spaces -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/spaces"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements spaces.Spaces that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   spaces.Spaces
+}
+
+// AccessLoggingMiddleware instruments an implementation of the spaces.Spaces with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next spaces.Spaces) spaces.Spaces {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) AbortTransfer(ctx context.Context, spaceID string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("AbortTransfer.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceID", spaceID),
+	)
+
+	err = m.next.AbortTransfer(ctx, spaceID)
+
+	m.logger.Debug("AbortTransfer.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Create(ctx context.Context, space *spaces.Space) (created *spaces.Space, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Create.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("space", space),
+	)
+
+	created, err = m.next.Create(ctx, space)
+
+	m.logger.Debug("Create.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("created", created),
+		zap.Error(err),
+	)
+
+	return created, err
+}
+
+func (m *accessLoggingMiddleware) Delete(ctx context.Context, spaceId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Delete.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+	)
+
+	err = m.next.Delete(ctx, spaceId)
+
+	m.logger.Debug("Delete.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, spaceId string) (space *spaces.Space, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+	)
+
+	space, err = m.next.Get(ctx, spaceId)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("space", space),
+		zap.Error(err),
+	)
+
+	return space, err
+}
+
+func (m *accessLoggingMiddleware) List(ctx context.Context, orgId string) (spaces []*spaces.Space, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("List.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("orgId", orgId),
+	)
+
+	spaces, err = m.next.List(ctx, orgId)
+
+	m.logger.Debug("List.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("spaces", spaces),
+		zap.Error(err),
+	)
+
+	return spaces, err
+}
+
+func (m *accessLoggingMiddleware) ListTransfers(ctx context.Context, orgID string) (spaces []*spaces.Space, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("ListTransfers.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("orgID", orgID),
+	)
+
+	spaces, err = m.next.ListTransfers(ctx, orgID)
+
+	m.logger.Debug("ListTransfers.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("spaces", spaces),
+		zap.Error(err),
+	)
+
+	return spaces, err
+}
+
+func (m *accessLoggingMiddleware) Move(ctx context.Context, spaceID string, orgID string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Move.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceID", spaceID),
+		zap.Reflect("orgID", orgID),
+	)
+
+	err = m.next.Move(ctx, spaceID, orgID)
+
+	m.logger.Debug("Move.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Transfer(ctx context.Context, spaceID string, transferToOrg string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Transfer.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceID", spaceID),
+		zap.Reflect("transferToOrg", transferToOrg),
+	)
+
+	err = m.next.Transfer(ctx, spaceID, transferToOrg)
+
+	m.logger.Debug("Transfer.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Update(ctx context.Context, space *spaces.Space) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Update.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("space", space),
+	)
+
+	err = m.next.Update(ctx, space)
+
+	m.logger.Debug("Update.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) UpdateConfig(ctx context.Context, spaceId string, config *spaces.Config) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("UpdateConfig.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("spaceId", spaceId),
+		zap.Reflect("config", config),
+	)
+
+	err = m.next.UpdateConfig(ctx, spaceId, config)
+
+	m.logger.Debug("UpdateConfig.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/pkg/spaces/middleware/error_logging_middleware.go b/pkg/spaces/middleware/error_logging_middleware.go
index b82cc16f7b7652dcec33bb262346d727c719d390..2b11838b51f1a033e9963a729c6378401e193d0c 100644
--- a/pkg/spaces/middleware/error_logging_middleware.go
+++ b/pkg/spaces/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/spaces -i Spaces -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/spaces/middleware/logging_middleware.go b/pkg/spaces/middleware/logging_middleware.go
deleted file mode 100644
index 499ed2d23d12737be2af49ec02835956d4b6eb83..0000000000000000000000000000000000000000
--- a/pkg/spaces/middleware/logging_middleware.go
+++ /dev/null
@@ -1,401 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/spaces -i Spaces -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/spaces"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements spaces.Spaces that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   spaces.Spaces
-}
-
-// LoggingMiddleware instruments an implementation of the spaces.Spaces with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next spaces.Spaces) spaces.Spaces {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) AbortTransfer(ctx context.Context, spaceID string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceID": spaceID} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("AbortTransfer.Request", fields...)
-
-	err = m.next.AbortTransfer(ctx, spaceID)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("AbortTransfer.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Create(ctx context.Context, space *spaces.Space) (created *spaces.Space, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":   ctx,
-		"space": space} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Request", fields...)
-
-	created, err = m.next.Create(ctx, space)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"created": created,
-		"err":     err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Response", fields...)
-
-	return created, err
-}
-
-func (m *loggingMiddleware) Delete(ctx context.Context, spaceId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Request", fields...)
-
-	err = m.next.Delete(ctx, spaceId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, spaceId string) (space *spaces.Space, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	space, err = m.next.Get(ctx, spaceId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"space": space,
-		"err":   err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return space, err
-}
-
-func (m *loggingMiddleware) List(ctx context.Context, orgId string) (spaces []*spaces.Space, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":   ctx,
-		"orgId": orgId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Request", fields...)
-
-	spaces, err = m.next.List(ctx, orgId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"spaces": spaces,
-		"err":    err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("List.Response", fields...)
-
-	return spaces, err
-}
-
-func (m *loggingMiddleware) ListTransfers(ctx context.Context, orgID string) (spaces []*spaces.Space, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":   ctx,
-		"orgID": orgID} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListTransfers.Request", fields...)
-
-	spaces, err = m.next.ListTransfers(ctx, orgID)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"spaces": spaces,
-		"err":    err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("ListTransfers.Response", fields...)
-
-	return spaces, err
-}
-
-func (m *loggingMiddleware) Move(ctx context.Context, spaceID string, orgID string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceID": spaceID,
-		"orgID":   orgID} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Move.Request", fields...)
-
-	err = m.next.Move(ctx, spaceID, orgID)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Move.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Transfer(ctx context.Context, spaceID string, transferToOrg string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":           ctx,
-		"spaceID":       spaceID,
-		"transferToOrg": transferToOrg} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Transfer.Request", fields...)
-
-	err = m.next.Transfer(ctx, spaceID, transferToOrg)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Transfer.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Update(ctx context.Context, space *spaces.Space) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":   ctx,
-		"space": space} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Request", fields...)
-
-	err = m.next.Update(ctx, space)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) UpdateConfig(ctx context.Context, spaceId string, config *spaces.Config) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"spaceId": spaceId,
-		"config":  config} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("UpdateConfig.Request", fields...)
-
-	err = m.next.UpdateConfig(ctx, spaceId, config)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("UpdateConfig.Response", fields...)
-
-	return err
-}
diff --git a/pkg/spaces/middleware/middleware.go b/pkg/spaces/middleware/middleware.go
index 7379b4ae182293f7750504663e59005551e3a63d..73c3b8c3538e6bf9a6457617afc35f68f429aaf3 100644
--- a/pkg/spaces/middleware/middleware.go
+++ b/pkg/spaces/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/spaces -i Spaces -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/spaces -i Spaces -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/spaces"
@@ -17,12 +17,12 @@ func WithLog(s spaces.Spaces, logger *zap.Logger, log_access bool) spaces.Spaces
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Spaces")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/pkg/spaces/middleware/recovering_middleware.go b/pkg/spaces/middleware/recovering_middleware.go
index ad13a929c8c1ebd9a6132043a00617352af7e6d8..7b9b64ed276aa9a91dd9e07ee1b463ff8bb06003 100644
--- a/pkg/spaces/middleware/recovering_middleware.go
+++ b/pkg/spaces/middleware/recovering_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/recovery
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/spaces -i Spaces -t ../../../assets/templates/middleware/recovery -o recovering_middleware.go -l ""
 
 import (
diff --git a/pkg/users/middleware/access_logging_middleware.go b/pkg/users/middleware/access_logging_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..dd8d4a14c73915d553381b239770fcf05c02aca5
--- /dev/null
+++ b/pkg/users/middleware/access_logging_middleware.go
@@ -0,0 +1,147 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/access_log.tmpl
+// gowrap: http://github.com/hexdigest/gowrap
+
+package middleware
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/users -i Users -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
+
+import (
+	"context"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/auth"
+	"git.perx.ru/perxis/perxis-go/pkg/options"
+	"git.perx.ru/perxis/perxis-go/pkg/users"
+	"go.uber.org/zap"
+)
+
+// accessLoggingMiddleware implements users.Users that is instrumented with logging
+type accessLoggingMiddleware struct {
+	logger *zap.Logger
+	next   users.Users
+}
+
+// AccessLoggingMiddleware instruments an implementation of the users.Users with simple logging
+func AccessLoggingMiddleware(logger *zap.Logger) Middleware {
+	return func(next users.Users) users.Users {
+		return &accessLoggingMiddleware{
+			next:   next,
+			logger: logger,
+		}
+	}
+}
+
+func (m *accessLoggingMiddleware) Create(ctx context.Context, create *users.User) (user *users.User, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Create.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("create", create),
+	)
+
+	user, err = m.next.Create(ctx, create)
+
+	m.logger.Debug("Create.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("user", user),
+		zap.Error(err),
+	)
+
+	return user, err
+}
+
+func (m *accessLoggingMiddleware) Delete(ctx context.Context, userId string) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Delete.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("userId", userId),
+	)
+
+	err = m.next.Delete(ctx, userId)
+
+	m.logger.Debug("Delete.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
+
+func (m *accessLoggingMiddleware) Find(ctx context.Context, filter *users.Filter, options *options.FindOptions) (users []*users.User, total int, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Find.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("filter", filter),
+		zap.Reflect("options", options),
+	)
+
+	users, total, err = m.next.Find(ctx, filter, options)
+
+	m.logger.Debug("Find.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("users", users),
+		zap.Reflect("total", total),
+		zap.Error(err),
+	)
+
+	return users, total, err
+}
+
+func (m *accessLoggingMiddleware) Get(ctx context.Context, userId string) (user *users.User, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Get.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("userId", userId),
+	)
+
+	user, err = m.next.Get(ctx, userId)
+
+	m.logger.Debug("Get.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("user", user),
+		zap.Error(err),
+	)
+
+	return user, err
+}
+
+func (m *accessLoggingMiddleware) GetByIdentity(ctx context.Context, identity string) (user *users.User, err error) {
+	begin := time.Now()
+
+	m.logger.Debug("GetByIdentity.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("identity", identity),
+	)
+
+	user, err = m.next.GetByIdentity(ctx, identity)
+
+	m.logger.Debug("GetByIdentity.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("user", user),
+		zap.Error(err),
+	)
+
+	return user, err
+}
+
+func (m *accessLoggingMiddleware) Update(ctx context.Context, update *users.User) (err error) {
+	begin := time.Now()
+
+	m.logger.Debug("Update.Request",
+		zap.Reflect("principal", auth.GetPrincipal(ctx)),
+		zap.Reflect("update", update),
+	)
+
+	err = m.next.Update(ctx, update)
+
+	m.logger.Debug("Update.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Error(err),
+	)
+
+	return err
+}
diff --git a/pkg/users/middleware/error_logging_middleware.go b/pkg/users/middleware/error_logging_middleware.go
index 688083dac93de779db6cdabd02002836901a0883..c499b9f3bf60726a10d30ced82e24bced6702236 100644
--- a/pkg/users/middleware/error_logging_middleware.go
+++ b/pkg/users/middleware/error_logging_middleware.go
@@ -1,9 +1,9 @@
-package middleware
-
 // Code generated by gowrap. DO NOT EDIT.
 // template: ../../../assets/templates/middleware/error_log
 // gowrap: http://github.com/hexdigest/gowrap
 
+package middleware
+
 //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/users -i Users -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
 
 import (
diff --git a/pkg/users/middleware/logging_middleware.go b/pkg/users/middleware/logging_middleware.go
deleted file mode 100644
index 0b9438ed939131c97679c5a3364a1e715be63b75..0000000000000000000000000000000000000000
--- a/pkg/users/middleware/logging_middleware.go
+++ /dev/null
@@ -1,257 +0,0 @@
-package middleware
-
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
-
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/users -i Users -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
-
-import (
-	"context"
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/auth"
-	"git.perx.ru/perxis/perxis-go/pkg/options"
-	"git.perx.ru/perxis/perxis-go/pkg/users"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-)
-
-// loggingMiddleware implements users.Users that is instrumented with logging
-type loggingMiddleware struct {
-	logger *zap.Logger
-	next   users.Users
-}
-
-// LoggingMiddleware instruments an implementation of the users.Users with simple logging
-func LoggingMiddleware(logger *zap.Logger) Middleware {
-	return func(next users.Users) users.Users {
-		return &loggingMiddleware{
-			next:   next,
-			logger: logger,
-		}
-	}
-}
-
-func (m *loggingMiddleware) Create(ctx context.Context, create *users.User) (user *users.User, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"create": create} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Request", fields...)
-
-	user, err = m.next.Create(ctx, create)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"user": user,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Create.Response", fields...)
-
-	return user, err
-}
-
-func (m *loggingMiddleware) Delete(ctx context.Context, userId string) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"userId": userId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Request", fields...)
-
-	err = m.next.Delete(ctx, userId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Delete.Response", fields...)
-
-	return err
-}
-
-func (m *loggingMiddleware) Find(ctx context.Context, filter *users.Filter, options *options.FindOptions) (users []*users.User, total int, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":     ctx,
-		"filter":  filter,
-		"options": options} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Find.Request", fields...)
-
-	users, total, err = m.next.Find(ctx, filter, options)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"users": users,
-		"total": total,
-		"err":   err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Find.Response", fields...)
-
-	return users, total, err
-}
-
-func (m *loggingMiddleware) Get(ctx context.Context, userId string) (user *users.User, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"userId": userId} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Request", fields...)
-
-	user, err = m.next.Get(ctx, userId)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"user": user,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Get.Response", fields...)
-
-	return user, err
-}
-
-func (m *loggingMiddleware) GetByIdentity(ctx context.Context, identity string) (user *users.User, err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":      ctx,
-		"identity": identity} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("GetByIdentity.Request", fields...)
-
-	user, err = m.next.GetByIdentity(ctx, identity)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"user": user,
-		"err":  err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("GetByIdentity.Response", fields...)
-
-	return user, err
-}
-
-func (m *loggingMiddleware) Update(ctx context.Context, update *users.User) (err error) {
-	begin := time.Now()
-	var fields []zapcore.Field
-	for k, v := range map[string]interface{}{
-		"ctx":    ctx,
-		"update": update} {
-		if k == "ctx" {
-			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Request", fields...)
-
-	err = m.next.Update(ctx, update)
-
-	fields = []zapcore.Field{
-		zap.Duration("time", time.Since(begin)),
-	}
-
-	for k, v := range map[string]interface{}{
-		"err": err} {
-		if k == "err" {
-			err, _ := v.(error)
-			fields = append(fields, zap.Error(err))
-			continue
-		}
-		fields = append(fields, zap.Reflect(k, v))
-	}
-
-	m.logger.Debug("Update.Response", fields...)
-
-	return err
-}
diff --git a/pkg/users/middleware/middleware.go b/pkg/users/middleware/middleware.go
index 63bc862271dc6d7002ea2db479aa359885ad5ebd..d94190827de3028c96000df15bf06c719e30cf92 100644
--- a/pkg/users/middleware/middleware.go
+++ b/pkg/users/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/users -i Users -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/users -i Users -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/users"
@@ -17,12 +17,12 @@ func WithLog(s users.Users, logger *zap.Logger, log_access bool) users.Users {
 	if logger == nil {
 		logger = zap.NewNop()
 	}
-
 	logger = logger.Named("Users")
-	s = ErrorLoggingMiddleware(logger)(s)
 	if log_access {
-		s = LoggingMiddleware(logger)(s)
+		s = AccessLoggingMiddleware(logger)(s)
 	}
+	s = ErrorLoggingMiddleware(logger)(s)
+
 	s = RecoveringMiddleware(logger)(s)
 	return s
 }
diff --git a/proto/log/log.pb.go b/proto/logs/log.pb.go
similarity index 63%
rename from proto/log/log.pb.go
rename to proto/logs/log.pb.go
index e25f01596081236521333ed1f2167a967ebea583..8beabf96d64b409bc99ebf0b6e6ecb64b1ae4aa6 100644
--- a/proto/log/log.pb.go
+++ b/proto/logs/log.pb.go
@@ -2,9 +2,9 @@
 // versions:
 // 	protoc-gen-go v1.31.0
 // 	protoc        v4.25.1
-// source: log/log.proto
+// source: logs/log.proto
 
-package log
+package logs
 
 import (
 	_ "git.perx.ru/perxis/perxis-go/proto/common"
@@ -68,11 +68,11 @@ func (x LogLevel) String() string {
 }
 
 func (LogLevel) Descriptor() protoreflect.EnumDescriptor {
-	return file_log_log_proto_enumTypes[0].Descriptor()
+	return file_logs_log_proto_enumTypes[0].Descriptor()
 }
 
 func (LogLevel) Type() protoreflect.EnumType {
-	return &file_log_log_proto_enumTypes[0]
+	return &file_logs_log_proto_enumTypes[0]
 }
 
 func (x LogLevel) Number() protoreflect.EnumNumber {
@@ -81,7 +81,7 @@ func (x LogLevel) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use LogLevel.Descriptor instead.
 func (LogLevel) EnumDescriptor() ([]byte, []int) {
-	return file_log_log_proto_rawDescGZIP(), []int{0}
+	return file_logs_log_proto_rawDescGZIP(), []int{0}
 }
 
 // LogEntry представляет собой структуру данных для хранения информации о журнале.
@@ -94,7 +94,7 @@ type LogEntry struct {
 	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 	// timestamp указывает на временную метку, указывающую когда было создано данное сообщение.
 	Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
-	Level     LogLevel               `protobuf:"varint,3,opt,name=level,proto3,enum=log.LogLevel" json:"level,omitempty"` // message это основное сообщение, которое требуется записать в лог.
+	Level     LogLevel               `protobuf:"varint,3,opt,name=level,proto3,enum=logs.LogLevel" json:"level,omitempty"` // message это основное сообщение, которое требуется записать в лог.
 	Message   string                 `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"`
 	// category указывает на категорию события.
 	// Примеры:
@@ -151,7 +151,7 @@ type LogEntry struct {
 func (x *LogEntry) Reset() {
 	*x = LogEntry{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_log_log_proto_msgTypes[0]
+		mi := &file_logs_log_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -164,7 +164,7 @@ func (x *LogEntry) String() string {
 func (*LogEntry) ProtoMessage() {}
 
 func (x *LogEntry) ProtoReflect() protoreflect.Message {
-	mi := &file_log_log_proto_msgTypes[0]
+	mi := &file_logs_log_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -177,7 +177,7 @@ func (x *LogEntry) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LogEntry.ProtoReflect.Descriptor instead.
 func (*LogEntry) Descriptor() ([]byte, []int) {
-	return file_log_log_proto_rawDescGZIP(), []int{0}
+	return file_logs_log_proto_rawDescGZIP(), []int{0}
 }
 
 func (x *LogEntry) GetId() string {
@@ -257,71 +257,72 @@ func (x *LogEntry) GetTags() []string {
 	return nil
 }
 
-var File_log_log_proto protoreflect.FileDescriptor
-
-var file_log_log_proto_rawDesc = []byte{
-	0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
-	0x03, 0x6c, 0x6f, 0x67, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdb, 0x02, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72,
-	0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
-	0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
-	0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x05, 0x6c,
-	0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x6c, 0x6f, 0x67,
-	0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c,
-	0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61,
-	0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61,
-	0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e,
-	0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f,
-	0x6e, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62,
-	0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f,
-	0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x65,
-	0x72, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c,
-	0x65, 0x72, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72, 0x18, 0x0a, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x61, 0x74, 0x74, 0x72, 0x12, 0x12,
-	0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61,
-	0x67, 0x73, 0x2a, 0x45, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x08,
-	0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e,
-	0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02,
-	0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x09,
-	0x0a, 0x05, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x04, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74,
-	0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f,
-	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
-	0x6c, 0x6f, 0x67, 0x3b, 0x6c, 0x6f, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+var File_logs_log_proto protoreflect.FileDescriptor
+
+var file_logs_log_proto_rawDesc = []byte{
+	0x0a, 0x0e, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdc, 0x02, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e,
+	0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a,
+	0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x6c,
+	0x6f, 0x67, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65,
+	0x76, 0x65, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a,
+	0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d,
+	0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f,
+	0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74,
+	0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a,
+	0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61,
+	0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63,
+	0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72, 0x18,
+	0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x61, 0x74, 0x74,
+	0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x04, 0x74, 0x61, 0x67, 0x73, 0x2a, 0x45, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65,
+	0x6c, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x57,
+	0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f,
+	0x52, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x10,
+	0x03, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x04, 0x42, 0x2e, 0x5a, 0x2c,
+	0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78,
+	0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x3b, 0x6c, 0x6f, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
-	file_log_log_proto_rawDescOnce sync.Once
-	file_log_log_proto_rawDescData = file_log_log_proto_rawDesc
+	file_logs_log_proto_rawDescOnce sync.Once
+	file_logs_log_proto_rawDescData = file_logs_log_proto_rawDesc
 )
 
-func file_log_log_proto_rawDescGZIP() []byte {
-	file_log_log_proto_rawDescOnce.Do(func() {
-		file_log_log_proto_rawDescData = protoimpl.X.CompressGZIP(file_log_log_proto_rawDescData)
+func file_logs_log_proto_rawDescGZIP() []byte {
+	file_logs_log_proto_rawDescOnce.Do(func() {
+		file_logs_log_proto_rawDescData = protoimpl.X.CompressGZIP(file_logs_log_proto_rawDescData)
 	})
-	return file_log_log_proto_rawDescData
+	return file_logs_log_proto_rawDescData
 }
 
-var file_log_log_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_log_log_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
-var file_log_log_proto_goTypes = []interface{}{
-	(LogLevel)(0),                 // 0: log.LogLevel
-	(*LogEntry)(nil),              // 1: log.LogEntry
+var file_logs_log_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_logs_log_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_logs_log_proto_goTypes = []interface{}{
+	(LogLevel)(0),                 // 0: logs.LogLevel
+	(*LogEntry)(nil),              // 1: logs.LogEntry
 	(*timestamppb.Timestamp)(nil), // 2: google.protobuf.Timestamp
 	(*anypb.Any)(nil),             // 3: google.protobuf.Any
 }
-var file_log_log_proto_depIdxs = []int32{
-	2, // 0: log.LogEntry.timestamp:type_name -> google.protobuf.Timestamp
-	0, // 1: log.LogEntry.level:type_name -> log.LogLevel
-	3, // 2: log.LogEntry.attr:type_name -> google.protobuf.Any
+var file_logs_log_proto_depIdxs = []int32{
+	2, // 0: logs.LogEntry.timestamp:type_name -> google.protobuf.Timestamp
+	0, // 1: logs.LogEntry.level:type_name -> logs.LogLevel
+	3, // 2: logs.LogEntry.attr:type_name -> google.protobuf.Any
 	3, // [3:3] is the sub-list for method output_type
 	3, // [3:3] is the sub-list for method input_type
 	3, // [3:3] is the sub-list for extension type_name
@@ -329,13 +330,13 @@ var file_log_log_proto_depIdxs = []int32{
 	0, // [0:3] is the sub-list for field type_name
 }
 
-func init() { file_log_log_proto_init() }
-func file_log_log_proto_init() {
-	if File_log_log_proto != nil {
+func init() { file_logs_log_proto_init() }
+func file_logs_log_proto_init() {
+	if File_logs_log_proto != nil {
 		return
 	}
 	if !protoimpl.UnsafeEnabled {
-		file_log_log_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+		file_logs_log_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*LogEntry); i {
 			case 0:
 				return &v.state
@@ -352,19 +353,19 @@ func file_log_log_proto_init() {
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_log_log_proto_rawDesc,
+			RawDescriptor: file_logs_log_proto_rawDesc,
 			NumEnums:      1,
 			NumMessages:   1,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
-		GoTypes:           file_log_log_proto_goTypes,
-		DependencyIndexes: file_log_log_proto_depIdxs,
-		EnumInfos:         file_log_log_proto_enumTypes,
-		MessageInfos:      file_log_log_proto_msgTypes,
+		GoTypes:           file_logs_log_proto_goTypes,
+		DependencyIndexes: file_logs_log_proto_depIdxs,
+		EnumInfos:         file_logs_log_proto_enumTypes,
+		MessageInfos:      file_logs_log_proto_msgTypes,
 	}.Build()
-	File_log_log_proto = out.File
-	file_log_log_proto_rawDesc = nil
-	file_log_log_proto_goTypes = nil
-	file_log_log_proto_depIdxs = nil
+	File_logs_log_proto = out.File
+	file_logs_log_proto_rawDesc = nil
+	file_logs_log_proto_goTypes = nil
+	file_logs_log_proto_depIdxs = nil
 }
diff --git a/proto/log/log_service.pb.go b/proto/logs/log_service.pb.go
similarity index 57%
rename from proto/log/log_service.pb.go
rename to proto/logs/log_service.pb.go
index 02d2c1074d9bdb111da86dc8a02fabc22eb850c4..7036778591e3e51156c67eccffb05976fea10d38 100644
--- a/proto/log/log_service.pb.go
+++ b/proto/logs/log_service.pb.go
@@ -2,9 +2,9 @@
 // versions:
 // 	protoc-gen-go v1.31.0
 // 	protoc        v4.25.1
-// source: log/log_service.proto
+// source: logs/log_service.proto
 
-package log
+package logs
 
 import (
 	common "git.perx.ru/perxis/perxis-go/proto/common"
@@ -35,7 +35,7 @@ type LogRequest struct {
 func (x *LogRequest) Reset() {
 	*x = LogRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_log_log_service_proto_msgTypes[0]
+		mi := &file_logs_log_service_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -48,7 +48,7 @@ func (x *LogRequest) String() string {
 func (*LogRequest) ProtoMessage() {}
 
 func (x *LogRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_log_log_service_proto_msgTypes[0]
+	mi := &file_logs_log_service_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -61,7 +61,7 @@ func (x *LogRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LogRequest.ProtoReflect.Descriptor instead.
 func (*LogRequest) Descriptor() ([]byte, []int) {
-	return file_log_log_service_proto_rawDescGZIP(), []int{0}
+	return file_logs_log_service_proto_rawDescGZIP(), []int{0}
 }
 
 func (x *LogRequest) GetEntries() []*LogEntry {
@@ -84,7 +84,7 @@ type LogResponse struct {
 func (x *LogResponse) Reset() {
 	*x = LogResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_log_log_service_proto_msgTypes[1]
+		mi := &file_logs_log_service_proto_msgTypes[1]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -97,7 +97,7 @@ func (x *LogResponse) String() string {
 func (*LogResponse) ProtoMessage() {}
 
 func (x *LogResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_log_log_service_proto_msgTypes[1]
+	mi := &file_logs_log_service_proto_msgTypes[1]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -110,7 +110,7 @@ func (x *LogResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LogResponse.ProtoReflect.Descriptor instead.
 func (*LogResponse) Descriptor() ([]byte, []int) {
-	return file_log_log_service_proto_rawDescGZIP(), []int{1}
+	return file_logs_log_service_proto_rawDescGZIP(), []int{1}
 }
 
 func (x *LogResponse) GetError() *common.Error {
@@ -137,7 +137,7 @@ type Filter struct {
 func (x *Filter) Reset() {
 	*x = Filter{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_log_log_service_proto_msgTypes[2]
+		mi := &file_logs_log_service_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -150,7 +150,7 @@ func (x *Filter) String() string {
 func (*Filter) ProtoMessage() {}
 
 func (x *Filter) ProtoReflect() protoreflect.Message {
-	mi := &file_log_log_service_proto_msgTypes[2]
+	mi := &file_logs_log_service_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -163,7 +163,7 @@ func (x *Filter) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Filter.ProtoReflect.Descriptor instead.
 func (*Filter) Descriptor() ([]byte, []int) {
-	return file_log_log_service_proto_rawDescGZIP(), []int{2}
+	return file_logs_log_service_proto_rawDescGZIP(), []int{2}
 }
 
 func (x *Filter) GetQ() []string {
@@ -188,7 +188,7 @@ type FindRequest struct {
 func (x *FindRequest) Reset() {
 	*x = FindRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_log_log_service_proto_msgTypes[3]
+		mi := &file_logs_log_service_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -201,7 +201,7 @@ func (x *FindRequest) String() string {
 func (*FindRequest) ProtoMessage() {}
 
 func (x *FindRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_log_log_service_proto_msgTypes[3]
+	mi := &file_logs_log_service_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -214,7 +214,7 @@ func (x *FindRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindRequest.ProtoReflect.Descriptor instead.
 func (*FindRequest) Descriptor() ([]byte, []int) {
-	return file_log_log_service_proto_rawDescGZIP(), []int{3}
+	return file_logs_log_service_proto_rawDescGZIP(), []int{3}
 }
 
 func (x *FindRequest) GetFilter() *Filter {
@@ -251,7 +251,7 @@ type FindResult struct {
 func (x *FindResult) Reset() {
 	*x = FindResult{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_log_log_service_proto_msgTypes[4]
+		mi := &file_logs_log_service_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -264,7 +264,7 @@ func (x *FindResult) String() string {
 func (*FindResult) ProtoMessage() {}
 
 func (x *FindResult) ProtoReflect() protoreflect.Message {
-	mi := &file_log_log_service_proto_msgTypes[4]
+	mi := &file_logs_log_service_proto_msgTypes[4]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -277,7 +277,7 @@ func (x *FindResult) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindResult.ProtoReflect.Descriptor instead.
 func (*FindResult) Descriptor() ([]byte, []int) {
-	return file_log_log_service_proto_rawDescGZIP(), []int{4}
+	return file_logs_log_service_proto_rawDescGZIP(), []int{4}
 }
 
 func (x *FindResult) GetEntries() []*LogEntry {
@@ -324,7 +324,7 @@ type FindResponse struct {
 func (x *FindResponse) Reset() {
 	*x = FindResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_log_log_service_proto_msgTypes[5]
+		mi := &file_logs_log_service_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -337,7 +337,7 @@ func (x *FindResponse) String() string {
 func (*FindResponse) ProtoMessage() {}
 
 func (x *FindResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_log_log_service_proto_msgTypes[5]
+	mi := &file_logs_log_service_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -350,7 +350,7 @@ func (x *FindResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindResponse.ProtoReflect.Descriptor instead.
 func (*FindResponse) Descriptor() ([]byte, []int) {
-	return file_log_log_service_proto_rawDescGZIP(), []int{5}
+	return file_logs_log_service_proto_rawDescGZIP(), []int{5}
 }
 
 func (m *FindResponse) GetResponse() isFindResponse_Response {
@@ -405,7 +405,7 @@ type DeleteRequest struct {
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_log_log_service_proto_msgTypes[6]
+		mi := &file_logs_log_service_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -418,7 +418,7 @@ func (x *DeleteRequest) String() string {
 func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_log_log_service_proto_msgTypes[6]
+	mi := &file_logs_log_service_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -431,7 +431,7 @@ func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead.
 func (*DeleteRequest) Descriptor() ([]byte, []int) {
-	return file_log_log_service_proto_rawDescGZIP(), []int{6}
+	return file_logs_log_service_proto_rawDescGZIP(), []int{6}
 }
 
 func (x *DeleteRequest) GetFilter() *Filter {
@@ -454,7 +454,7 @@ type DeleteResponse struct {
 func (x *DeleteResponse) Reset() {
 	*x = DeleteResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_log_log_service_proto_msgTypes[7]
+		mi := &file_logs_log_service_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -467,7 +467,7 @@ func (x *DeleteResponse) String() string {
 func (*DeleteResponse) ProtoMessage() {}
 
 func (x *DeleteResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_log_log_service_proto_msgTypes[7]
+	mi := &file_logs_log_service_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -480,7 +480,7 @@ func (x *DeleteResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteResponse.ProtoReflect.Descriptor instead.
 func (*DeleteResponse) Descriptor() ([]byte, []int) {
-	return file_log_log_service_proto_rawDescGZIP(), []int{7}
+	return file_logs_log_service_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *DeleteResponse) GetError() *common.Error {
@@ -490,114 +490,115 @@ func (x *DeleteResponse) GetError() *common.Error {
 	return nil
 }
 
-var File_log_log_service_proto protoreflect.FileDescriptor
-
-var file_log_log_service_proto_rawDesc = []byte{
-	0x0a, 0x15, 0x6c, 0x6f, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x6c, 0x6f, 0x67, 0x1a, 0x13, 0x63, 0x6f,
-	0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0d, 0x6c, 0x6f, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x35, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e,
-	0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x32, 0x0a, 0x0b,
-	0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x65,
-	0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6f, 0x6d,
-	0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
-	0x22, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x71, 0x18,
-	0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x01, 0x71, 0x22, 0x61, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65,
-	0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x46, 0x69,
-	0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x07,
-	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
-	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x0a,
-	0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x27, 0x0a, 0x07, 0x65, 0x6e,
-	0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6c, 0x6f,
-	0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72,
-	0x69, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
-	0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
-	0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07,
-	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x6c, 0x0a,
-	0x0c, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a,
-	0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e,
-	0x6c, 0x6f, 0x67, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00,
-	0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f,
-	0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
-	0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42,
-	0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x0d, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x06,
-	0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6c,
-	0x6f, 0x67, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65,
-	0x72, 0x22, 0x35, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f,
-	0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x32, 0x9c, 0x01, 0x0a, 0x0a, 0x4c, 0x6f, 0x67,
-	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x0f,
-	0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x10, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x04, 0x46, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x2e, 0x6c, 0x6f,
-	0x67, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e,
-	0x6c, 0x6f, 0x67, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x12, 0x33, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6c,
-	0x6f, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x13, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x2e, 0x70,
+var File_logs_log_service_proto protoreflect.FileDescriptor
+
+var file_logs_log_service_proto_rawDesc = []byte{
+	0x0a, 0x16, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x13,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x6c, 0x6f,
+	0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x36, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x4c,
+	0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73,
+	0x22, 0x32, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x23, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d,
+	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65,
+	0x72, 0x72, 0x6f, 0x72, 0x22, 0x16, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x0c,
+	0x0a, 0x01, 0x71, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x01, 0x71, 0x22, 0x62, 0x0a, 0x0b,
+	0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x06, 0x66,
+	0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6c, 0x6f,
+	0x67, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65,
+	0x72, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64,
+	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x22, 0xa1, 0x01, 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12,
+	0x28, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x6c,
+	0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6c, 0x6f, 0x67, 0x73,
+	0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12,
+	0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14,
+	0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74,
+	0x6f, 0x74, 0x61, 0x6c, 0x22, 0x6d, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64,
+	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00,
+	0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x35, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74,
+	0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x35, 0x0a, 0x0e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x05,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x32, 0xa3, 0x01, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x12, 0x2c, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x10, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e,
+	0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6c, 0x6f, 0x67,
+	0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x2f, 0x0a, 0x04, 0x46, 0x69, 0x6e, 0x64, 0x12, 0x11, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x46,
+	0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6c, 0x6f, 0x67,
+	0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+	0x12, 0x35, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x6c, 0x6f, 0x67,
+	0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x14, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x2e, 0x70,
 	0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65,
 	0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6c, 0x6f,
-	0x67, 0x3b, 0x6c, 0x6f, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x67, 0x73, 0x3b, 0x6c, 0x6f, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
-	file_log_log_service_proto_rawDescOnce sync.Once
-	file_log_log_service_proto_rawDescData = file_log_log_service_proto_rawDesc
+	file_logs_log_service_proto_rawDescOnce sync.Once
+	file_logs_log_service_proto_rawDescData = file_logs_log_service_proto_rawDesc
 )
 
-func file_log_log_service_proto_rawDescGZIP() []byte {
-	file_log_log_service_proto_rawDescOnce.Do(func() {
-		file_log_log_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_log_log_service_proto_rawDescData)
+func file_logs_log_service_proto_rawDescGZIP() []byte {
+	file_logs_log_service_proto_rawDescOnce.Do(func() {
+		file_logs_log_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_logs_log_service_proto_rawDescData)
 	})
-	return file_log_log_service_proto_rawDescData
-}
-
-var file_log_log_service_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
-var file_log_log_service_proto_goTypes = []interface{}{
-	(*LogRequest)(nil),         // 0: log.LogRequest
-	(*LogResponse)(nil),        // 1: log.LogResponse
-	(*Filter)(nil),             // 2: log.Filter
-	(*FindRequest)(nil),        // 3: log.FindRequest
-	(*FindResult)(nil),         // 4: log.FindResult
-	(*FindResponse)(nil),       // 5: log.FindResponse
-	(*DeleteRequest)(nil),      // 6: log.DeleteRequest
-	(*DeleteResponse)(nil),     // 7: log.DeleteResponse
-	(*LogEntry)(nil),           // 8: log.LogEntry
+	return file_logs_log_service_proto_rawDescData
+}
+
+var file_logs_log_service_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
+var file_logs_log_service_proto_goTypes = []interface{}{
+	(*LogRequest)(nil),         // 0: logs.LogRequest
+	(*LogResponse)(nil),        // 1: logs.LogResponse
+	(*Filter)(nil),             // 2: logs.Filter
+	(*FindRequest)(nil),        // 3: logs.FindRequest
+	(*FindResult)(nil),         // 4: logs.FindResult
+	(*FindResponse)(nil),       // 5: logs.FindResponse
+	(*DeleteRequest)(nil),      // 6: logs.DeleteRequest
+	(*DeleteResponse)(nil),     // 7: logs.DeleteResponse
+	(*LogEntry)(nil),           // 8: logs.LogEntry
 	(*common.Error)(nil),       // 9: common.Error
 	(*common.FindOptions)(nil), // 10: common.FindOptions
 }
-var file_log_log_service_proto_depIdxs = []int32{
-	8,  // 0: log.LogRequest.entries:type_name -> log.LogEntry
-	9,  // 1: log.LogResponse.error:type_name -> common.Error
-	2,  // 2: log.FindRequest.filter:type_name -> log.Filter
-	10, // 3: log.FindRequest.options:type_name -> common.FindOptions
-	8,  // 4: log.FindResult.entries:type_name -> log.LogEntry
-	2,  // 5: log.FindResult.filter:type_name -> log.Filter
-	10, // 6: log.FindResult.options:type_name -> common.FindOptions
-	4,  // 7: log.FindResponse.result:type_name -> log.FindResult
-	9,  // 8: log.FindResponse.error:type_name -> common.Error
-	2,  // 9: log.DeleteRequest.filter:type_name -> log.Filter
-	9,  // 10: log.DeleteResponse.error:type_name -> common.Error
-	0,  // 11: log.LogService.Log:input_type -> log.LogRequest
-	3,  // 12: log.LogService.Find:input_type -> log.FindRequest
-	6,  // 13: log.LogService.Delete:input_type -> log.DeleteRequest
-	1,  // 14: log.LogService.Log:output_type -> log.LogResponse
-	5,  // 15: log.LogService.Find:output_type -> log.FindResponse
-	7,  // 16: log.LogService.Delete:output_type -> log.DeleteResponse
+var file_logs_log_service_proto_depIdxs = []int32{
+	8,  // 0: logs.LogRequest.entries:type_name -> logs.LogEntry
+	9,  // 1: logs.LogResponse.error:type_name -> common.Error
+	2,  // 2: logs.FindRequest.filter:type_name -> logs.Filter
+	10, // 3: logs.FindRequest.options:type_name -> common.FindOptions
+	8,  // 4: logs.FindResult.entries:type_name -> logs.LogEntry
+	2,  // 5: logs.FindResult.filter:type_name -> logs.Filter
+	10, // 6: logs.FindResult.options:type_name -> common.FindOptions
+	4,  // 7: logs.FindResponse.result:type_name -> logs.FindResult
+	9,  // 8: logs.FindResponse.error:type_name -> common.Error
+	2,  // 9: logs.DeleteRequest.filter:type_name -> logs.Filter
+	9,  // 10: logs.DeleteResponse.error:type_name -> common.Error
+	0,  // 11: logs.LogsService.Log:input_type -> logs.LogRequest
+	3,  // 12: logs.LogsService.Find:input_type -> logs.FindRequest
+	6,  // 13: logs.LogsService.Delete:input_type -> logs.DeleteRequest
+	1,  // 14: logs.LogsService.Log:output_type -> logs.LogResponse
+	5,  // 15: logs.LogsService.Find:output_type -> logs.FindResponse
+	7,  // 16: logs.LogsService.Delete:output_type -> logs.DeleteResponse
 	14, // [14:17] is the sub-list for method output_type
 	11, // [11:14] is the sub-list for method input_type
 	11, // [11:11] is the sub-list for extension type_name
@@ -605,14 +606,14 @@ var file_log_log_service_proto_depIdxs = []int32{
 	0,  // [0:11] is the sub-list for field type_name
 }
 
-func init() { file_log_log_service_proto_init() }
-func file_log_log_service_proto_init() {
-	if File_log_log_service_proto != nil {
+func init() { file_logs_log_service_proto_init() }
+func file_logs_log_service_proto_init() {
+	if File_logs_log_service_proto != nil {
 		return
 	}
-	file_log_log_proto_init()
+	file_logs_log_proto_init()
 	if !protoimpl.UnsafeEnabled {
-		file_log_log_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+		file_logs_log_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*LogRequest); i {
 			case 0:
 				return &v.state
@@ -624,7 +625,7 @@ func file_log_log_service_proto_init() {
 				return nil
 			}
 		}
-		file_log_log_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+		file_logs_log_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*LogResponse); i {
 			case 0:
 				return &v.state
@@ -636,7 +637,7 @@ func file_log_log_service_proto_init() {
 				return nil
 			}
 		}
-		file_log_log_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+		file_logs_log_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Filter); i {
 			case 0:
 				return &v.state
@@ -648,7 +649,7 @@ func file_log_log_service_proto_init() {
 				return nil
 			}
 		}
-		file_log_log_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+		file_logs_log_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FindRequest); i {
 			case 0:
 				return &v.state
@@ -660,7 +661,7 @@ func file_log_log_service_proto_init() {
 				return nil
 			}
 		}
-		file_log_log_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+		file_logs_log_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FindResult); i {
 			case 0:
 				return &v.state
@@ -672,7 +673,7 @@ func file_log_log_service_proto_init() {
 				return nil
 			}
 		}
-		file_log_log_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+		file_logs_log_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FindResponse); i {
 			case 0:
 				return &v.state
@@ -684,7 +685,7 @@ func file_log_log_service_proto_init() {
 				return nil
 			}
 		}
-		file_log_log_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+		file_logs_log_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DeleteRequest); i {
 			case 0:
 				return &v.state
@@ -696,7 +697,7 @@ func file_log_log_service_proto_init() {
 				return nil
 			}
 		}
-		file_log_log_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+		file_logs_log_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DeleteResponse); i {
 			case 0:
 				return &v.state
@@ -709,7 +710,7 @@ func file_log_log_service_proto_init() {
 			}
 		}
 	}
-	file_log_log_service_proto_msgTypes[5].OneofWrappers = []interface{}{
+	file_logs_log_service_proto_msgTypes[5].OneofWrappers = []interface{}{
 		(*FindResponse_Result)(nil),
 		(*FindResponse_Error)(nil),
 	}
@@ -717,18 +718,18 @@ func file_log_log_service_proto_init() {
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_log_log_service_proto_rawDesc,
+			RawDescriptor: file_logs_log_service_proto_rawDesc,
 			NumEnums:      0,
 			NumMessages:   8,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
-		GoTypes:           file_log_log_service_proto_goTypes,
-		DependencyIndexes: file_log_log_service_proto_depIdxs,
-		MessageInfos:      file_log_log_service_proto_msgTypes,
+		GoTypes:           file_logs_log_service_proto_goTypes,
+		DependencyIndexes: file_logs_log_service_proto_depIdxs,
+		MessageInfos:      file_logs_log_service_proto_msgTypes,
 	}.Build()
-	File_log_log_service_proto = out.File
-	file_log_log_service_proto_rawDesc = nil
-	file_log_log_service_proto_goTypes = nil
-	file_log_log_service_proto_depIdxs = nil
+	File_logs_log_service_proto = out.File
+	file_logs_log_service_proto_rawDesc = nil
+	file_logs_log_service_proto_goTypes = nil
+	file_logs_log_service_proto_depIdxs = nil
 }
diff --git a/proto/log/log_service_grpc.pb.go b/proto/logs/log_service_grpc.pb.go
similarity index 51%
rename from proto/log/log_service_grpc.pb.go
rename to proto/logs/log_service_grpc.pb.go
index d9dfda0b67492f3e5521a4f368d24502c206b542..ad55cee20f51d0135ab737a566f405696fe693fa 100644
--- a/proto/log/log_service_grpc.pb.go
+++ b/proto/logs/log_service_grpc.pb.go
@@ -2,9 +2,9 @@
 // versions:
 // - protoc-gen-go-grpc v1.3.0
 // - protoc             v4.25.1
-// source: log/log_service.proto
+// source: logs/log_service.proto
 
-package log
+package logs
 
 import (
 	context "context"
@@ -19,15 +19,15 @@ import (
 const _ = grpc.SupportPackageIsVersion7
 
 const (
-	LogService_Log_FullMethodName    = "/log.LogService/Log"
-	LogService_Find_FullMethodName   = "/log.LogService/Find"
-	LogService_Delete_FullMethodName = "/log.LogService/Delete"
+	LogsService_Log_FullMethodName    = "/logs.LogsService/Log"
+	LogsService_Find_FullMethodName   = "/logs.LogsService/Find"
+	LogsService_Delete_FullMethodName = "/logs.LogsService/Delete"
 )
 
-// LogServiceClient is the client API for LogService service.
+// LogsServiceClient is the client API for LogsService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type LogServiceClient interface {
+type LogsServiceClient interface {
 	// Метод для записи логов
 	Log(ctx context.Context, in *LogRequest, opts ...grpc.CallOption) (*LogResponse, error)
 	// Метод для поиска логов по заданным параметрам
@@ -36,154 +36,154 @@ type LogServiceClient interface {
 	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error)
 }
 
-type logServiceClient struct {
+type logsServiceClient struct {
 	cc grpc.ClientConnInterface
 }
 
-func NewLogServiceClient(cc grpc.ClientConnInterface) LogServiceClient {
-	return &logServiceClient{cc}
+func NewLogsServiceClient(cc grpc.ClientConnInterface) LogsServiceClient {
+	return &logsServiceClient{cc}
 }
 
-func (c *logServiceClient) Log(ctx context.Context, in *LogRequest, opts ...grpc.CallOption) (*LogResponse, error) {
+func (c *logsServiceClient) Log(ctx context.Context, in *LogRequest, opts ...grpc.CallOption) (*LogResponse, error) {
 	out := new(LogResponse)
-	err := c.cc.Invoke(ctx, LogService_Log_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, LogsService_Log_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *logServiceClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (*FindResponse, error) {
+func (c *logsServiceClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (*FindResponse, error) {
 	out := new(FindResponse)
-	err := c.cc.Invoke(ctx, LogService_Find_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, LogsService_Find_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *logServiceClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) {
+func (c *logsServiceClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) {
 	out := new(DeleteResponse)
-	err := c.cc.Invoke(ctx, LogService_Delete_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, LogsService_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-// LogServiceServer is the server API for LogService service.
-// All implementations must embed UnimplementedLogServiceServer
+// LogsServiceServer is the server API for LogsService service.
+// All implementations must embed UnimplementedLogsServiceServer
 // for forward compatibility
-type LogServiceServer interface {
+type LogsServiceServer interface {
 	// Метод для записи логов
 	Log(context.Context, *LogRequest) (*LogResponse, error)
 	// Метод для поиска логов по заданным параметрам
 	Find(context.Context, *FindRequest) (*FindResponse, error)
 	// Метод для удаления логов по заданным параметрам
 	Delete(context.Context, *DeleteRequest) (*DeleteResponse, error)
-	mustEmbedUnimplementedLogServiceServer()
+	mustEmbedUnimplementedLogsServiceServer()
 }
 
-// UnimplementedLogServiceServer must be embedded to have forward compatible implementations.
-type UnimplementedLogServiceServer struct {
+// UnimplementedLogsServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedLogsServiceServer struct {
 }
 
-func (UnimplementedLogServiceServer) Log(context.Context, *LogRequest) (*LogResponse, error) {
+func (UnimplementedLogsServiceServer) Log(context.Context, *LogRequest) (*LogResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Log not implemented")
 }
-func (UnimplementedLogServiceServer) Find(context.Context, *FindRequest) (*FindResponse, error) {
+func (UnimplementedLogsServiceServer) Find(context.Context, *FindRequest) (*FindResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Find not implemented")
 }
-func (UnimplementedLogServiceServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
+func (UnimplementedLogsServiceServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
 }
-func (UnimplementedLogServiceServer) mustEmbedUnimplementedLogServiceServer() {}
+func (UnimplementedLogsServiceServer) mustEmbedUnimplementedLogsServiceServer() {}
 
-// UnsafeLogServiceServer may be embedded to opt out of forward compatibility for this service.
-// Use of this interface is not recommended, as added methods to LogServiceServer will
+// UnsafeLogsServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to LogsServiceServer will
 // result in compilation errors.
-type UnsafeLogServiceServer interface {
-	mustEmbedUnimplementedLogServiceServer()
+type UnsafeLogsServiceServer interface {
+	mustEmbedUnimplementedLogsServiceServer()
 }
 
-func RegisterLogServiceServer(s grpc.ServiceRegistrar, srv LogServiceServer) {
-	s.RegisterService(&LogService_ServiceDesc, srv)
+func RegisterLogsServiceServer(s grpc.ServiceRegistrar, srv LogsServiceServer) {
+	s.RegisterService(&LogsService_ServiceDesc, srv)
 }
 
-func _LogService_Log_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+func _LogsService_Log_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(LogRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(LogServiceServer).Log(ctx, in)
+		return srv.(LogsServiceServer).Log(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: LogService_Log_FullMethodName,
+		FullMethod: LogsService_Log_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(LogServiceServer).Log(ctx, req.(*LogRequest))
+		return srv.(LogsServiceServer).Log(ctx, req.(*LogRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _LogService_Find_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+func _LogsService_Find_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(FindRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(LogServiceServer).Find(ctx, in)
+		return srv.(LogsServiceServer).Find(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: LogService_Find_FullMethodName,
+		FullMethod: LogsService_Find_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(LogServiceServer).Find(ctx, req.(*FindRequest))
+		return srv.(LogsServiceServer).Find(ctx, req.(*FindRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _LogService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+func _LogsService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(DeleteRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(LogServiceServer).Delete(ctx, in)
+		return srv.(LogsServiceServer).Delete(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: LogService_Delete_FullMethodName,
+		FullMethod: LogsService_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(LogServiceServer).Delete(ctx, req.(*DeleteRequest))
+		return srv.(LogsServiceServer).Delete(ctx, req.(*DeleteRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-// LogService_ServiceDesc is the grpc.ServiceDesc for LogService service.
+// LogsService_ServiceDesc is the grpc.ServiceDesc for LogsService service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
-var LogService_ServiceDesc = grpc.ServiceDesc{
-	ServiceName: "log.LogService",
-	HandlerType: (*LogServiceServer)(nil),
+var LogsService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "logs.LogsService",
+	HandlerType: (*LogsServiceServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
 			MethodName: "Log",
-			Handler:    _LogService_Log_Handler,
+			Handler:    _LogsService_Log_Handler,
 		},
 		{
 			MethodName: "Find",
-			Handler:    _LogService_Find_Handler,
+			Handler:    _LogsService_Find_Handler,
 		},
 		{
 			MethodName: "Delete",
-			Handler:    _LogService_Delete_Handler,
+			Handler:    _LogsService_Delete_Handler,
 		},
 	},
 	Streams:  []grpc.StreamDesc{},
-	Metadata: "log/log_service.proto",
+	Metadata: "logs/log_service.proto",
 }