Skip to content

Commit 341b148

Browse files
committed
feat: compatibility with Casbin v3.6.0
1 parent 871ffed commit 341b148

File tree

5 files changed

+457
-88
lines changed

5 files changed

+457
-88
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@
4848
You could import the zap-logger module like:
4949
```
5050
import (
51-
zaplogger "github.com/casbin/zap-logger/v2"
52-
"github.com/casbin/casbin/v2"
51+
zaplogger "github.com/casbin/zap-logger/v3"
52+
"github.com/casbin/casbin/v3"
5353
)
5454
```
5555
You could let your enforcer use this logger when you first initialize your enforcer like:

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
module github.com/casbin/zap-logger/v2
1+
module github.com/casbin/zap-logger/v3
22

33
go 1.14
44

55
require (
6-
github.com/casbin/casbin/v2 v2.19.8
6+
github.com/casbin/casbin/v3 v3.10.0
77
github.com/kr/text v0.2.0 // indirect
88
github.com/pkg/errors v0.9.1 // indirect
9+
github.com/stretchr/testify v1.6.1 // indirect
910
go.uber.org/multierr v1.6.0 // indirect
1011
go.uber.org/zap v1.16.0
1112
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect

go.sum

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
11
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
22
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3-
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
4-
github.com/casbin/casbin/v2 v2.19.8 h1:hmlbARamCCE9hmcE7N/NRQqzti6Wu8CdF+QwpXzhFQU=
5-
github.com/casbin/casbin/v2 v2.19.8/go.mod h1:wUgota0cQbTXE6Vd+KWpg41726jFRi7upxio0sR+Xd0=
3+
github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
4+
github.com/casbin/casbin/v3 v3.10.0 h1:039ORla55vCeIZWd0LfzWFt1yiEA5X4W41xBW2bQuHs=
5+
github.com/casbin/casbin/v3 v3.10.0/go.mod h1:5rJbQr2e6AuuDDNxnPc5lQlC9nIgg6nS1zYwKXhpHC8=
6+
github.com/casbin/govaluate v1.3.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A=
67
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
78
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
89
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
910
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
10-
github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
11-
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
1211
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
12+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
1313
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
14-
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
1514
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
1615
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
1716
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
1817
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
19-
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
2018
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
2119
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
2220
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
23-
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
2421
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
2522
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
2623
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -29,36 +26,30 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
2926
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
3027
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
3128
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
32-
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
3329
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
3430
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
3531
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
3632
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
3733
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
38-
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
3934
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
4035
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
4136
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
42-
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
4337
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
4438
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
4539
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
46-
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
4740
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
4841
go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM=
4942
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
5043
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
5144
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
5245
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
5346
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
54-
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
5547
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
5648
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI=
5749
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
5850
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
5951
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
6052
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
61-
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
6253
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
6354
golang.org/x/mod v0.4.0 h1:8pl+sMODzuvGJkmj2W4kZihvVb5mKm8pB/X44PIQHv8=
6455
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -77,10 +68,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
7768
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
7869
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
7970
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
80-
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
8171
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
8272
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
83-
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs=
8473
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
8574
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
8675
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
@@ -93,20 +82,16 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
9382
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
9483
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
9584
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
96-
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
9785
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
9886
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
9987
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
10088
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
101-
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
10289
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
10390
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
10491
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
105-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
10692
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
10793
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
10894
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
109-
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
11095
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
11196
honnef.co/go/tools v0.1.0 h1:AWNL1W1i7f0wNZ8VwOKNJ0sliKvOF/adn0EHenfUh+c=
11297
honnef.co/go/tools v0.1.0/go.mod h1:XtegFAyX/PfluP4921rXU5IkjkqBCDnUq4W8VCIoKvM=

logger.go

Lines changed: 82 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
package zaplogger
1616

1717
import (
18+
"fmt"
1819
"sync/atomic"
20+
"time"
1921

20-
"github.com/casbin/casbin/v2/log"
22+
"github.com/casbin/casbin/v3/log"
2123
"go.uber.org/zap"
2224
"go.uber.org/zap/zapcore"
2325
)
@@ -26,8 +28,10 @@ var _ log.Logger = &Logger{}
2628

2729
// Logger is the implementation for a Logger using zap.
2830
type Logger struct {
29-
enabled int32
30-
logger *zap.Logger
31+
enabled int32
32+
logger *zap.Logger
33+
eventTypes map[log.EventType]bool
34+
logCallback func(entry *log.LogEntry) error
3135
}
3236

3337
type stringMatrix [][]string
@@ -86,7 +90,8 @@ func NewLogger(enabled, jsonEncode bool) *Logger {
8690
// NewLoggerByZap creates zap-logger by an existing zap instance.
8791
func NewLoggerByZap(zapLogger *zap.Logger, enabled bool) *Logger {
8892
logger := &Logger{
89-
logger: zapLogger,
93+
logger: zapLogger,
94+
eventTypes: make(map[log.EventType]bool),
9095
}
9196
logger.EnableLog(enabled)
9297
return logger
@@ -104,62 +109,93 @@ func (l *Logger) IsEnabled() bool {
104109
return atomic.LoadInt32(&l.enabled) == 1
105110
}
106111

107-
func (l *Logger) LogModel(model [][]string) {
108-
if !l.IsEnabled() {
109-
return
112+
// SetEventTypes sets the event types that should be logged.
113+
// Only events matching these types will have IsActive set to true.
114+
func (l *Logger) SetEventTypes(eventTypes []log.EventType) error {
115+
l.eventTypes = make(map[log.EventType]bool)
116+
for _, et := range eventTypes {
117+
l.eventTypes[et] = true
110118
}
111-
112-
l.logger.Info("LogModel", zap.Array("model", stringMatrix(model)))
119+
return nil
113120
}
114121

115-
func (l *Logger) LogEnforce(matcher string, request []interface{}, result bool, explains [][]string) {
116-
if !l.IsEnabled() {
117-
return
122+
// OnBeforeEvent is called before an event occurs.
123+
// It sets the StartTime and determines if the event should be active based on configured event types.
124+
func (l *Logger) OnBeforeEvent(entry *log.LogEntry) error {
125+
if entry == nil {
126+
return fmt.Errorf("log entry is nil")
118127
}
119128

120-
l.logger.Info(
121-
"LogEnforce",
122-
zap.String("matcher", matcher),
123-
zap.Array("request", zapcore.ArrayMarshalerFunc(func(enc zapcore.ArrayEncoder) error {
124-
for _, v := range request {
125-
if err := enc.AppendReflected(v); err != nil {
126-
return err
127-
}
128-
}
129-
return nil
130-
})),
131-
zap.Bool("result", result),
132-
zap.Array("explains", stringMatrix(explains)),
133-
)
129+
entry.StartTime = time.Now()
130+
131+
// Set IsActive based on whether this event type is enabled
132+
// If no event types are configured, all events are considered active
133+
if len(l.eventTypes) == 0 {
134+
entry.IsActive = true
135+
} else {
136+
entry.IsActive = l.eventTypes[entry.EventType]
137+
}
138+
139+
return nil
134140
}
135141

136-
func (l *Logger) LogPolicy(policy map[string][][]string) {
137-
if !l.IsEnabled() {
138-
return
142+
// OnAfterEvent is called after an event completes.
143+
// It calculates the duration, logs the entry if active, and calls the user callback if set.
144+
func (l *Logger) OnAfterEvent(entry *log.LogEntry) error {
145+
if entry == nil {
146+
return fmt.Errorf("log entry is nil")
139147
}
140148

141-
l.logger.Info("LogPolicy", zap.Object("policy", zapcore.ObjectMarshalerFunc(func(enc zapcore.ObjectEncoder) error {
142-
for k, v := range policy {
143-
if err := enc.AddArray(k, stringMatrix(v)); err != nil {
144-
return err
149+
entry.EndTime = time.Now()
150+
entry.Duration = entry.EndTime.Sub(entry.StartTime)
151+
152+
// Only log if the event is active
153+
if entry.IsActive && l.IsEnabled() {
154+
// Build zap fields from log entry
155+
fields := []zap.Field{
156+
zap.String("event_type", string(entry.EventType)),
157+
zap.Duration("duration", entry.Duration),
158+
}
159+
160+
// Add event-specific fields
161+
switch entry.EventType {
162+
case log.EventEnforce:
163+
fields = append(fields,
164+
zap.String("subject", entry.Subject),
165+
zap.String("object", entry.Object),
166+
zap.String("action", entry.Action),
167+
zap.String("domain", entry.Domain),
168+
zap.Bool("allowed", entry.Allowed),
169+
)
170+
171+
case log.EventAddPolicy, log.EventRemovePolicy, log.EventLoadPolicy, log.EventSavePolicy:
172+
fields = append(fields, zap.Int("rule_count", entry.RuleCount))
173+
if len(entry.Rules) > 0 {
174+
fields = append(fields, zap.Array("rules", stringMatrix(entry.Rules)))
145175
}
146176
}
147-
return nil
148-
})))
149-
}
150177

151-
func (l *Logger) LogRole(roles []string) {
152-
if !l.IsEnabled() {
153-
return
178+
// Log at appropriate level
179+
message := string(entry.EventType)
180+
if entry.Error != nil {
181+
fields = append(fields, zap.Error(entry.Error))
182+
l.logger.Error(message, fields...)
183+
} else {
184+
l.logger.Info(message, fields...)
185+
}
154186
}
155187

156-
l.logger.Info("LogRole", zap.Strings("roles", roles))
157-
}
158-
159-
func (l *Logger) LogError(err error, msg ...string) {
160-
if !l.IsEnabled() {
161-
return
188+
// Call user-provided callback if set
189+
if l.logCallback != nil {
190+
return l.logCallback(entry)
162191
}
163192

164-
l.logger.Error("LogError", zap.Error(err), zap.Strings("msg", msg))
193+
return nil
194+
}
195+
196+
// SetLogCallback sets a user-provided callback function.
197+
// The callback is called at the end of OnAfterEvent.
198+
func (l *Logger) SetLogCallback(callback func(entry *log.LogEntry) error) error {
199+
l.logCallback = callback
200+
return nil
165201
}

0 commit comments

Comments
 (0)