Lewati ke konten utama

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().

catatan

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.

LoggerPenulisDeskripsi
Logger default (bawaan)CasbinLogger default menggunakan log golang.
Pencatat ZapCasbinMenggunakan zap, berikan log yang dikodekan JSON dan Anda dapat menyesuaikan lebih banyak dengan pencatat zap Anda sendiri.

Cara menulis pencatat

Logger Anda harus mengimplementasikan antarmuka Logger.

MetodeTipeDeskripsi
EnableLog()wajibMengontrol apakah akan mencetak pesan.
IsEnabled()wajibTampilkan status pengaktifan logger saat ini.
LogModel()wajibCatat informasi terkait model.
LogEnforce()wajibCatat informasi terkait penerapan.
LogRole()wajibCatat informasi terkait peran.
LogPolicy()wajibCatat 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:

  1. Sintaksis tidak valid dalam file model (.conf).
  2. Sintaksis tidak valid dalam file kebijakan (.csv).
  3. Kesalahan kustom dari adaptor penyimpanan, misalnya, MySQL gagal terhubung.
  4. Bug Casbin.

Ada lima fungsi utama yang mungkin perlu Anda ketahui untuk menangani kesalahan atau panik:

FungsiPerilaku saat terjadi kesalahan
NewEnforcer()Mengembalikan sebuah kesalahan
LoadModel()Mengembalikan sebuah kesalahan
LoadPolicy()Mengembalikan sebuah kesalahan
SavePolicy()Mengembalikan sebuah kesalahan
Enforce()Mengembalikan sebuah kesalahan
catatan

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