...
1
18
19
20 package stdout
21
22 import (
23 "encoding/json"
24 "log"
25 "os"
26 "time"
27
28 "google.golang.org/grpc/authz/audit"
29 "google.golang.org/grpc/grpclog"
30 )
31
32 var grpcLogger = grpclog.Component("authz-audit")
33
34
35 const Name = "stdout_logger"
36
37 func init() {
38 audit.RegisterLoggerBuilder(&loggerBuilder{
39 goLogger: log.New(os.Stdout, "", 0),
40 })
41 }
42
43 type event struct {
44 FullMethodName string `json:"rpc_method"`
45 Principal string `json:"principal"`
46 PolicyName string `json:"policy_name"`
47 MatchedRule string `json:"matched_rule"`
48 Authorized bool `json:"authorized"`
49 Timestamp string `json:"timestamp"`
50 }
51
52
53 type logger struct {
54 goLogger *log.Logger
55 }
56
57
58 func (l *logger) Log(event *audit.Event) {
59 jsonContainer := map[string]any{
60 "grpc_audit_log": convertEvent(event),
61 }
62 jsonBytes, err := json.Marshal(jsonContainer)
63 if err != nil {
64 grpcLogger.Errorf("failed to marshal AuditEvent data to JSON: %v", err)
65 return
66 }
67 l.goLogger.Println(string(jsonBytes))
68 }
69
70
71
72 type loggerConfig struct {
73 audit.LoggerConfig
74 }
75
76 type loggerBuilder struct {
77 goLogger *log.Logger
78 }
79
80 func (loggerBuilder) Name() string {
81 return Name
82 }
83
84
85
86
87 func (lb *loggerBuilder) Build(audit.LoggerConfig) audit.Logger {
88 return &logger{
89 goLogger: lb.goLogger,
90 }
91 }
92
93
94 func (*loggerBuilder) ParseLoggerConfig(config json.RawMessage) (audit.LoggerConfig, error) {
95 if len(config) != 0 && string(config) != "{}" {
96 grpcLogger.Warningf("Stdout logger doesn't support custom configs. Ignoring:\n%s", string(config))
97 }
98 return &loggerConfig{}, nil
99 }
100
101 func convertEvent(auditEvent *audit.Event) *event {
102 return &event{
103 FullMethodName: auditEvent.FullMethodName,
104 Principal: auditEvent.Principal,
105 PolicyName: auditEvent.PolicyName,
106 MatchedRule: auditEvent.MatchedRule,
107 Authorized: auditEvent.Authorized,
108 Timestamp: time.Now().Format(time.RFC3339Nano),
109 }
110 }
111
View as plain text