Ana içeriğe atla

Log & Error Handling

Günlük Kaydı

Casbin, varsayılan olarak konsola günlükleri yazdırmak için yerleşik log kullanır, örneğin:

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

Günlük kaydı varsayılan olarak etkin değildir. Enforcer.EnableLog() veya NewEnforcer()'ın son parametresi aracılığıyla bunu açıp kapatabilirsiniz.

not

Zaten model, uygulama isteği, rol ve politikayı Golang'da günlüğe kaydetmeyi destekliyoruz. Casbin'i günlüğe kaydetmek için kendi günlük kaydınızı tanımlayabilirsiniz. Eğer Python kullanıyorsanız, pycasbin varsayılan Python günlük mekanizmasını kullanır. pycasbin paketi, günlükçüyü ayarlamak için logging.getLogger() çağrısı yapar. Günlükçüyü ana uygulamada başlatmak dışında özel bir günlük yapılandırmasına ihtiyaç yoktur. Eğer ana uygulama içinde günlük başlatılmamışsa, pycasbin'den herhangi bir günlük mesajı görmeyeceksiniz. Aynı zamanda, pycasbin'de günlüğü etkinleştirdiğinizde, varsayılan günlük yapılandırmasını kullanacaktır. Diğer pycasbin uzantıları için, eğer Django kullanıcısıysanız Django günlük belgelerine başvurabilirsiniz. Diğer Python kullanıcıları için, günlükçüyü yapılandırmak amacıyla Python günlük belgelerine başvurmalısınız.

Farklı zorlayıcılar için farklı günlükçüler kullanın

Her zorlayıcı kendi günlükçüsüne sahip olabilir ve çalışma zamanında değiştirilebilir.

Ve NewEnforcer() fonksiyonunun son parametresi aracılığıyla uygun bir logger kullanabilirsiniz. Eğer enforcer'ınızı bu şekilde başlatıyorsanız, enabled parametresini kullanmanıza gerek yoktur çünkü logger'daki enabled alanının önceliği daha yüksektir.

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

Desteklenen loglar

Size yardımcı olmak için bazı loglar sağlıyoruz.

LoggerYazarAçıklama
Varsayılan logger (yerleşik)CasbinVarsayılan logger, golang log kullanılarak oluşturulmuştur.
Zap loggerCasbinzap kullanarak, json kodlu günlük sağlayın ve kendi zap-logger'ınızla daha fazla özelleştirebilirsiniz.

Nasıl bir logger yazılır

Günlükçünüz Logger arayüzünü uygulamalıdır.

MetodTipAçıklama
EnableLog()zorunluMesajın yazdırılıp yazdırılmayacağını kontrol eder.
IsEnabled()zorunluMevcut günlükçünün etkin durumunu gösterir.
LogModel()zorunluModelle ilgili bilgileri kaydet.
LogEnforce()zorunluUygulamayla ilgili bilgileri kaydet.
LogRole()zorunluRolle ilgili bilgileri kaydet.
LogPolicy()zorunluPolitika ile ilgili log bilgilerini kaydedin.

Özel loggerınızı Enforcer.SetLogger() işlevine aktarabilirsiniz.

Golang için bir logger'ı nasıl özelleştireceğinize dair bir örnek:

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

Hata yönetimi

Casbin kullanırken şu gibi nedenlerle hatalar veya panikler meydana gelebilir:

  1. Model dosyasındaki (.conf) geçersiz sözdizimi.
  2. Politika dosyasındaki (.csv) geçersiz sözdizimi.
  3. Depolama adaptörlerinden gelen özel hatalar, örneğin, MySQL bağlantısı başarısız olur.
  4. Casbin'in hata durumu.

Hatalar veya panikler için bilmeniz gerekebilecek beş ana fonksiyon bulunmaktadır:

FonksiyonHata durumunda davranış
NewEnforcer()Bir hata döndürür
LoadModel()Bir hata döndürür
LoadPolicy()Bir hata döndürür
SavePolicy()Hata döndürür
Enforce()Hata döndürür
not

NewEnforcer() işlevi, LoadModel() ve LoadPolicy() işlevlerini dahili olarak çağırır. Bu nedenle, NewEnforcer() kullanırken son iki işlevi çağırmanıza gerek yoktur.

Etkinleştirme ve devre dışı bırakma

Zorlayıcı, Enforcer.EnableEnforce() fonksiyonu aracılığıyla devre dışı bırakılabilir. Devre dışı bırakıldığında, Enforcer.Enforce() her zaman true döndürecektir. Politika ekleme veya kaldırma gibi diğer işlemler etkilenmez. İşte bir örnek:

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