Log & Error Handling
Pencatatan
Casbin menggunakan log
bawaan untuk mencetak log ke konsol secara default, seperti:
2017/07/15 19:43:56 [Request: alice, data1, read ---> true]
Pencatatan tidak diaktifkan secara default. Anda dapat mengaktifkannya melalui Enforcer.EnableLog()
atau parameter terakhir dari NewEnforcer()
.
Kami sudah mendukung pencatatan model, permintaan penerapan, peran, dan kebijakan di Golang. Anda dapat menentukan log Anda sendiri untuk mencatat Casbin.
Jika Anda menggunakan Python, pycasbin memanfaatkan mekanisme logging default Python. Paket pycasbin melakukan panggilan ke logging.getLogger()
untuk mengatur logger. Tidak diperlukan konfigurasi logging khusus selain menginisialisasi logger di aplikasi induk. Jika tidak ada logging yang diinisialisasi dalam aplikasi induk, Anda tidak akan melihat pesan log apa pun dari pycasbin. Pada saat yang sama, ketika Anda mengaktifkan log di pycasbin, itu akan menggunakan konfigurasi log default. Untuk ekstensi pycasbin lainnya, Anda dapat merujuk ke dokumentasi logging Django jika Anda pengguna Django. Untuk pengguna Python lainnya, Anda harus merujuk ke dokumentasi logging Python untuk mengonfigurasi logger.
Gunakan logger yang berbeda untuk enforcer yang berbeda
Setiap enforcer dapat memiliki logger sendiri untuk mencatat informasi, dan dapat diubah saat runtime.
Dan Anda dapat menggunakan logger yang sesuai melalui parameter terakhir dari NewEnforcer()
. Jika Anda menggunakan cara ini untuk menginisialisasi enforcer Anda, Anda tidak perlu menggunakan parameter enabled karena prioritas field enabled dalam logger 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 didukung
Kami menyediakan beberapa logger untuk membantu Anda mencatat informasi.
- Go
- PHP
Logger | Penulis | Deskripsi |
---|---|---|
Logger default (bawaan) | Casbin | Logger default menggunakan log golang. |
Pencatat Zap | Casbin | Menggunakan zap, berikan log yang dikodekan JSON dan Anda dapat menyesuaikan lebih banyak dengan pencatat zap Anda sendiri. |
Pencatat | Penulis | Deskripsi |
---|---|---|
pencatat jembatan psr3 | Casbin | Menyediakan jembatan yang sesuai dengan PSR-3. |
Cara menulis pencatat
Logger Anda harus mengimplementasikan antarmuka Logger.
Metode | Tipe | Deskripsi |
---|---|---|
EnableLog() | wajib | Mengontrol apakah akan mencetak pesan. |
IsEnabled() | wajib | Tampilkan status pengaktifan logger saat ini. |
LogModel() | wajib | Catat informasi terkait model. |
LogEnforce() | wajib | Catat informasi terkait penerapan. |
LogRole() | wajib | Catat informasi terkait peran. |
LogPolicy() | wajib | Catat info terkait kebijakan. |
Anda dapat meneruskan logger
kustom 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)
}
Penanganan kesalahan
Kesalahan atau panic dapat terjadi saat Anda menggunakan Casbin karena alasan seperti:
- Sintaksis tidak valid dalam file model (.conf).
- Sintaksis tidak valid dalam file kebijakan (.csv).
- Kesalahan kustom dari adaptor penyimpanan, misalnya, MySQL gagal terhubung.
- Bug Casbin.
Ada lima fungsi utama yang mungkin perlu Anda ketahui untuk menangani kesalahan atau panik:
Fungsi | Perilaku saat terjadi kesalahan |
---|---|
NewEnforcer() | Mengembalikan sebuah kesalahan |
LoadModel() | Mengembalikan sebuah kesalahan |
LoadPolicy() | Mengembalikan sebuah kesalahan |
SavePolicy() | Mengembalikan sebuah kesalahan |
Enforce() | Mengembalikan sebuah kesalahan |
NewEnforcer()
memanggil LoadModel()
dan LoadPolicy()
secara internal. Jadi, Anda tidak perlu memanggil dua yang terakhir ketika menggunakan NewEnforcer()
.
Mengaktifkan dan menonaktifkan
Enforcer dapat dinonaktifkan melalui fungsi Enforcer.EnableEnforce()
. Ketika dinonaktifkan, Enforcer.Enforce()
akan selalu mengembalikan true
. Operasi lain seperti menambahkan atau menghapus kebijakan tidak terpengaruh. Berikut adalah contohnya:
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")