ข้ามไปยังเนื้อหาหลัก

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 บางตัวเพื่อช่วยคุณในการบันทึกข้อมูล

Loggerผู้สร้างคำอธิบาย
Default logger (built-in)CasbinDefault logger ที่ใช้ golang log
Zap loggerCasbinใช้ zap ให้บันทึกข้อมูลในรูปแบบ json และคุณสามารถปรับแต่งเพิ่มเติมด้วย zap-logger ของคุณเอง

วิธีการเขียน 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 เนื่องจากเหตุผลต่างๆ เช่น:

  1. ไวยากรณ์ไม่ถูกต้องในไฟล์โมเดล (.conf)
  2. ไวยากรณ์ไม่ถูกต้องในไฟล์นโยบาย (.csv)
  3. ข้อผิดพลาดที่กำหนดเองจากอะแดปเตอร์การจัดเก็บข้อมูล เช่น MySQL ไม่สามารถเชื่อมต่อได้
  4. ข้อบกพร่องของ 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")