Langkau ke kandungan utama

Log & Error Handling

Pencatatan

Casbin menggunakan log terbina dalam untuk mencetak log ke konsol secara lalai, seperti:

2017/07/15 19:43:56 [Request: alice, data1, read ---> true]

Pencatatan tidak diaktifkan secara lalai. Anda boleh menukarnya melalui Enforcer.EnableLog() atau parameter terakhir NewEnforcer().

nota

Kami sudah menyokong pencatatan model, permintaan penguatkuasaan, peranan, dan polisi dalam Golang. Anda boleh menentukan log anda sendiri untuk mencatat Casbin. Jika anda menggunakan Python, pycasbin menggunakan mekanisme pencatatan (logging) bawaan Python. Pakej pycasbin membuat panggilan ke logging.getLogger() untuk menetapkan logger. Tidak diperlukan konfigurasi pencatatan khas selain menginisialisasi logger dalam aplikasi induk. Jika tidak ada pencatatan yang diinisialisasi dalam aplikasi induk, anda tidak akan melihat apa-apa mesej log dari pycasbin. Pada masa yang sama, apabila anda mengaktifkan log dalam pycasbin, ia akan menggunakan konfigurasi log lalai. Untuk sambungan pycasbin lain, anda boleh merujuk kepada dokumen pencatatan Django jika anda pengguna Django. Bagi pengguna Python lain, anda harus merujuk kepada dokumen pencatatan Python untuk mengkonfigurasi logger.

Gunakan logger yang berbeza untuk penguatkuasaan yang berbeza

Setiap penguatkuasa boleh mempunyai logger sendiri untuk mencatat maklumat, dan ia boleh diubah pada waktu runtime.

Dan anda boleh menggunakan logger yang sesuai melalui parameter terakhir NewEnforcer(). Jika anda menggunakan cara ini untuk memulakan enforcer anda, anda tidak perlu menggunakan parameter enabled kerana keutamaan medan enabled dalam logger adalah lebih tinggi.

// 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 yang disokong

Kami menyediakan beberapa logger untuk membantu anda mencatat maklumat.

LoggerPengarangPenerangan
Logger lalai (terbina dalam)CasbinLogger lalai menggunakan log golang.
Pencatat ZapCasbinMenggunakan zap, berikan log yang dikodkan JSON dan anda boleh menyesuaikan lebih dengan pencatat zap anda sendiri.

Cara menulis pencatat

Pencatat anda harus melaksanakan antara muka Logger.

KaedahJenisPenerangan
EnableLog()wajibKawal sama ada untuk mencetak mesej.
IsEnabled()wajibTunjukkan status yang didayakan bagi pencatat semasa.
LogModel()wajibLog maklumat berkaitan model.
LogEnforce()wajibLog maklumat berkaitan penguatkuasaan.
LogRole()wajibLog maklumat berkaitan peranan.
LogPolicy()wajibLog maklumat berkaitan polisi.

Anda boleh lulus logger tersuai anda ke Enforcer.SetLogger().

Berikut adalah contoh cara menyesuaikan logger untuk 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)
}

Pengendalian ralat

Ralat atau panik mungkin berlaku apabila anda menggunakan Casbin atas sebab-sebab seperti:

  1. Sintaks tidak sah dalam fail model (.conf).
  2. Sintaks tidak sah dalam fail polisi (.csv).
  3. Ralat tersuai dari adaptor storan, contohnya, MySQL gagal menyambung.
  4. Bug Casbin.

Terdapat lima fungsi utama yang mungkin anda perlu ketahui untuk kesalahan atau panik:

FungsiTingkah laku pada kesalahan
NewEnforcer()Mengembalikan ralat
LoadModel()Mengembalikan ralat
LoadPolicy()Mengembalikan ralat
SavePolicy()Mengembalikan ralat
Enforce()Mengembalikan ralat
nota

NewEnforcer() memanggil LoadModel() dan LoadPolicy() secara dalaman. Oleh itu, anda tidak perlu memanggil dua yang terakhir ketika menggunakan NewEnforcer().

Aktifkan dan nyahaktifkan

Penegak boleh dinonaktifkan melalui fungsi Enforcer.EnableEnforce(). Apabila ia dinonaktifkan, Enforcer.Enforce() akan sentiasa mengembalikan true. Operasi lain seperti menambah atau mengalih keluar polisi tidak terjejas. Berikut adalah contoh:

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")