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()
.
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.
- Go
- PHP
Logger | Pengarang | Penerangan |
---|---|---|
Logger lalai (terbina dalam) | Casbin | Logger lalai menggunakan log golang. |
Pencatat Zap | Casbin | Menggunakan zap, berikan log yang dikodkan JSON dan anda boleh menyesuaikan lebih dengan pencatat zap anda sendiri. |
Pencatat | Pengarang | Penerangan |
---|---|---|
pencatat jambatan psr3 | Casbin | Menyediakan jambatan yang mematuhi PSR-3. |
Cara menulis pencatat
Pencatat anda harus melaksanakan antara muka Logger.
Kaedah | Jenis | Penerangan |
---|---|---|
EnableLog() | wajib | Kawal sama ada untuk mencetak mesej. |
IsEnabled() | wajib | Tunjukkan status yang didayakan bagi pencatat semasa. |
LogModel() | wajib | Log maklumat berkaitan model. |
LogEnforce() | wajib | Log maklumat berkaitan penguatkuasaan. |
LogRole() | wajib | Log maklumat berkaitan peranan. |
LogPolicy() | wajib | Log 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:
- Sintaks tidak sah dalam fail model (.conf).
- Sintaks tidak sah dalam fail polisi (.csv).
- Ralat tersuai dari adaptor storan, contohnya, MySQL gagal menyambung.
- Bug Casbin.
Terdapat lima fungsi utama yang mungkin anda perlu ketahui untuk kesalahan atau panik:
Fungsi | Tingkah laku pada kesalahan |
---|---|
NewEnforcer() | Mengembalikan ralat |
LoadModel() | Mengembalikan ralat |
LoadPolicy() | Mengembalikan ralat |
SavePolicy() | Mengembalikan ralat |
Enforce() | Mengembalikan ralat |
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")