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