Log & Error Handling
การบันทึก
Casbin ใช้ log
ที่มาพร้อมกับระบบเพื่อพิมพ์บันทึกไปยังคอนโซลโดยค่าเริ่มต้น เช่น:
2017/07/15 19:43:56 [Request: alice, data1, read ---> true]
การบันทึกไม่ได้ถูกเปิดใช้งานโดยค่าเริ่มต้น คุณสามารถเปิดหรือปิดการใช้งานได้ผ่าน Enforcer.EnableLog()
หรือพารามิเตอร์สุดท้ายของ NewEnforcer()
เราได้รับการสนับสนุนการบันทึกโมเดล, คำขอการบังคับใช้, บทบาท, และนโยบายใน Golang แล้ว คุณสามารถกำหนดบันทึกของคุณเองสำหรับการบันทึก Casbin
หากคุณใช้ Python, pycasbin ใช้กลไกการบันทึกของ Python ที่เป็นค่าเริ่มต้น แพ็คเกจ pycasbin ทำการเรียก logging.getLogger()
เพื่อตั้งค่า logger ไม่จำเป็นต้องมีการกำหนดค่าการบันทึกพิเศษนอกจากการเริ่มต้นใช้งาน logger ในแอปพลิเคชันหลัก หากไม่มีการเริ่มต้นใช้งานการบันทึกในแอปพลิเคชันหลัก คุณจะไม่เห็นข้อความบันทึกใดๆ จาก pycasbin ในเวลาเดียวกัน เมื่อคุณเปิดใช้งานการบันทึกใน pycasbin มันจะใช้ การกำหนดค่าการบันทึกเริ่มต้น สำหรับส่วนขยาย pycasbin อื่นๆ คุณสามารถอ้างอิงไปยัง เอกสารการบันทึกของ Django หากคุณเป็นผู้ใช้ Django สำหรับผู้ใช้ Python อื่นๆ คุณควรอ้างอิงไปยัง เอกสารการบันทึกของ Python เพื่อกำหนดค่า logger
ใช้ logger ที่แตกต่างกันสำหรับ enforcer ที่แตกต่างกัน
ทุก enforcer สามารถมี logger ของตัวเองเพื่อบันทึกข้อมูล และสามารถเปลี่ยนแปลงได้ในระหว่างการทำงาน
และคุณสามารถใช้ logger ที่เหมาะสมผ่านพารามิเตอร์สุดท้ายของ NewEnforcer()
หากคุณใช้วิธีนี้ในการเริ่มต้นใช้งาน enforcer ของคุณ คุณไม่จำเป็นต้องใช้พารามิเตอร์ enabled เพราะความสำคัญของฟิลด์ enabled ใน logger มีมากกว่า
// Set a default logger as enforcer e1's logger.
// This operation can also be seen as changing the logger of e1 at runtime.
e1.SetLogger(&Log.DefaultLogger{})
// Set another logger as enforcer e2's logger.
e2.SetLogger(&YouOwnLogger)
// Set your logger when initializing enforcer e3.
e3, _ := casbin.NewEnforcer("examples/rbac_model.conf", a, logger)
logger ที่ได้รับการสนับสนุน
เรามี logger บางตัวเพื่อช่วยคุณในการบันทึกข้อมูล
- Go
- PHP
Logger | ผู้สร้าง | คำอธิบาย |
---|---|---|
Default logger (built-in) | Casbin | Default logger ที่ใช้ golang log |
Zap logger | Casbin | ใช้ zap ให้บันทึกข้อมูลในรูปแบบ json และคุณสามารถปรับแต่งเพิ่มเติมด้วย zap-logger ของคุณเอง |
Logger | ผู้สร้าง | คำอธิบาย |
---|---|---|
psr3-bridge logger | Casbin | ให้บริการสะพานที่สอดคล้องกับ PSR-3 |
วิธีการเขียน logger
logger ของคุณควรทำการดำเนินการตาม Logger interface
วิธีการ | ประเภท | คำอธิบาย |
---|---|---|
EnableLog() | จำเป็น | ควบคุมว่าจะพิมพ์ข้อความหรือไม่ |
IsEnabled() | จำเป็น | แสดงสถานะการเปิดใช้งานของ logger ปัจจุบัน |
LogModel() | จำเป็น | บันทึกข้อมูลที่เกี่ยวข้องกับโมเดล |
LogEnforce() | mandatory | บันทึกข้อมูลที่เกี่ยวข้องกับการบังคับใช้ |
LogRole() | mandatory | บันทึกข้อมูลที่เกี่ยวข้องกับบทบาท |
LogPolicy() | mandatory | บันทึกข้อมูลที่เกี่ยวข้องกับนโยบาย |
You can pass your custom logger
to Enforcer.SetLogger()
.
นี่คือตัวอย่างของวิธีการปรับแต่ง logger สำหรับ Golang:
import (
"fmt"
"log"
"strings"
)
// DefaultLogger is the implementation for a Logger using golang log.
type DefaultLogger struct {
enabled bool
}
func (l *DefaultLogger) EnableLog(enable bool) {
l.enabled = enable
}
func (l *DefaultLogger) IsEnabled() bool {
return l.enabled
}
func (l *DefaultLogger) LogModel(model [][]string) {
if !l.enabled {
return
}
var str strings.Builder
str.WriteString("Model: ")
for _, v := range model {
str.WriteString(fmt.Sprintf("%v\n", v))
}
log.Println(str.String())
}
func (l *DefaultLogger) LogEnforce(matcher string, request []interface{}, result bool, explains [][]string) {
if !l.enabled {
return
}
var reqStr strings.Builder
reqStr.WriteString("Request: ")
for i, rval := range request {
if i != len(request)-1 {
reqStr.WriteString(fmt.Sprintf("%v, ", rval))
} else {
reqStr.WriteString(fmt.Sprintf("%v", rval))
}
}
reqStr.WriteString(fmt.Sprintf(" ---> %t\n", result))
reqStr.WriteString("Hit Policy: ")
for i, pval := range explains {
if i != len(explains)-1 {
reqStr.WriteString(fmt.Sprintf("%v, ", pval))
} else {
reqStr.WriteString(fmt.Sprintf("%v \n", pval))
}
}
log.Println(reqStr.String())
}
func (l *DefaultLogger) LogPolicy(policy map[string][][]string) {
if !l.enabled {
return
}
var str strings.Builder
str.WriteString("Policy: ")
for k, v := range policy {
str.WriteString(fmt.Sprintf("%s : %v\n", k, v))
}
log.Println(str.String())
}
func (l *DefaultLogger) LogRole(roles []string) {
if !l.enabled {
return
}
log.Println("Roles: ", roles)
}
Error handling
อาจเกิดข้อผิดพลาดหรือปัญหาเมื่อคุณใช้ Casbin เนื่องจากเหตุผลต่างๆ เช่น:
- ไวยากรณ์ไม่ถูกต้องในไฟล์โมเดล (.conf)
- ไวยากรณ์ไม่ถูกต้องในไฟล์นโยบาย (.csv)
- ข้อผิดพลาดที่กำหนดเองจากอะแดปเตอร์การจัดเก็บข้อมูล เช่น MySQL ไม่สามารถเชื่อมต่อได้
- ข้อบกพร่องของ Casbin
มีห้าฟังก์ชันหลักที่คุณอาจต้องระวังสำหรับข้อผิดพลาดหรือปัญหา:
ฟังก์ชัน | พฤติกรรมเมื่อเกิดข้อผิดพลาด |
---|---|
NewEnforcer() | คืนค่าข้อผิดพลาด |
LoadModel() | คืนค่าข้อผิดพลาด |
LoadPolicy() | คืนค่าข้อผิดพลาด |
SavePolicy() | คืนค่าข้อผิดพลาด |
Enforce() | คืนค่าข้อผิดพลาด |
NewEnforcer()
จะเรียก LoadModel()
และ LoadPolicy()
ภายใน ดังนั้นคุณไม่จำเป็นต้องเรียกสองฟังก์ชันหลังเมื่อใช้ NewEnforcer()
เปิดใช้งานและปิดใช้งาน
สามารถปิดการใช้งาน enforcer ผ่านฟังก์ชัน Enforcer.EnableEnforce()
เมื่อปิดการใช้งาน, Enforcer.Enforce()
จะคืนค่า true
เสมอ การดำเนินการอื่นๆ เช่น เพิ่มหรือลบนโยบายไม่ได้รับผลกระทบ นี่คือตัวอย่าง:
e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
// Will return false.
// By default, the enforcer is enabled.
e.Enforce("non-authorized-user", "data1", "read")
// Disable the enforcer at runtime.
e.EnableEnforce(false)
// Will return true for any request.
e.Enforce("non-authorized-user", "data1", "read")
// Enable the enforcer again.
e.EnableEnforce(true)
// Will return false.
e.Enforce("non-authorized-user", "data1", "read")