# 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"
]
}
}
```