# Access logger Resource ###### tags: `logger`, `code` ## 在 AccessLog 裡面需要埋入 resource 資訊 `logger/access_logger_formatter_params.go` 新增 function 與 const ``` const ( CtxResourceID = "ctxResourceID" CtxResourceName = "ctxResourceName" ) func (p *AccessFormatterParams) SetResource(c *gin.Context) *AccessFormatterParams { id, name := GetResource(c) p.Resource.ID = id p.Resource.Name = name return p } func SetResource(c *gin.Context, id, name string) { c.Set(CtxResourceID, id) c.Set(CtxResourceName, name) } func GetResource(c *gin.Context) (id, name string) { id = c.GetString(CtxResourceID) name = c.GetString(CtxResourceName) return } ``` ## 在 AccessLog 裡面需要埋入 extra 資訊 `logger/access_logger_formatter_params.go` * 修改 struct 新增 `Extra` field ``` type AccessFormatterParams struct { Extra map[string]interface{} `json:"extra"` } ``` * 新增 function 與 const ``` const ( CtxExtra = "ctxExtra" ) func (p *AccessFormatterParams) SetExtra(c *gin.Context) *AccessFormatterParams { extra := GetExtra(c) p.Extra = extra return p } func SetExtra(c *gin.Context, key string, value interface{}) { if value == nil { return } extraRaw, exists := c.Get(CtxExtra) var extraMap map[string]interface{} if exists { if em, ok := extraRaw.(map[string]interface{}); ok { extraMap = em } else { extraMap = make(map[string]interface{}) } } else { extraMap = make(map[string]interface{}) } extraMap[key] = value c.Set(CtxExtra, extraMap) } func GetExtra(c *gin.Context) map[string]interface{} { extra, exists := c.Get(CtxExtra) if !exists { return make(map[string]interface{}) } // check extra is map[string]interface{} if extraMap, ok := extra.(map[string]interface{}); ok { return extraMap } return make(map[string]interface{}) } ``` ## Resource, Extra 寫入至 access log `middleware/api/access_logger.go` ``` func AccessLoggerMiddleware(c *gin.Context) { // skip ... params. SetUserID(c.GetString(cnt.CtxUserID)). SetSAATUserIDByContext(c). SetProjectIDByContext(c). SetRequestID(c.GetString(cnt.RequestID)). SetTriggerType(logger.API). SetSourceIP(c.ClientIP()). SetResource(c). // 新增此行 SetExtra(c). // 新增此行 SetAccessLoggerInfoByPBAC(c).Writer() } ``` ## 使用方式 ### example 在 `controller/api/user/create_xxx.go` 加入 ``` // set access log logger.SetResource(c, resourceID, resourceName) logger.SetExtra(c, "flavors", []string{masterFlavorID}) ``` ## 輸出範例 ``` { "cloudinfra_log_type": "json", "service": { "id": "21", "name": "CloudKubeService" }, "resource": { "id": "99e7d2f9-fe1e-491a-affa-a7115210aef5", "name": "steven0312-k8s130-cpu1" }, "project": { "id": "2cee3815-66d8-47db-b8a8-12eb5796511f" }, "source": { "ip": "10.80.163.122" }, "user": { "id": "f9ffc12b-e34e-43fb-a0ed-f1cf04791869" }, "action": { "time": "2025-03-12T08:26:15.045Z", "message": "", "id": "21002", "name": "user:CreateCluster" }, "meta": { "triggerType": "api", "method": "POST", "statusCode": 201, "path": "/cks/api/v1/project/2cee3815-66d8-47db-b8a8-12eb5796511f/cluster", "latency": "1.389583799s", "requestID": "792bef02-f0b5-46dc-b3df-00592ee0c38d", "hostName": "2d326baf167d", "location": "9e395a8c-b117-45cd-835c-554027834971\n", "ad": "tw-tc-ad1" }, "saatUser": { "id": "" }, "extra": { "flavors": [ "a200048c-73a7-4766-94b8-905083d53997", "b4b79e7c-3a7d-4fa8-ade2-c2fec4d8bc40" ] } } ```