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.
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.
- Go
- PHP
Logger | Yazar | Açıklama |
---|---|---|
Varsayılan logger (yerleşik) | Casbin | Varsayılan logger, golang log kullanılarak oluşturulmuştur. |
Zap logger | Casbin | zap kullanarak, json kodlu günlük sağlayın ve kendi zap-logger'ınızla daha fazla özelleştirebilirsiniz. |
Logger | Yazar | Açıklama |
---|---|---|
psr3-bridge logger | Casbin | PSR-3 uyumlu bir köprü sağlar. |
Nasıl bir logger yazılır
Günlükçünüz Logger arayüzünü uygulamalıdır.
Metod | Tip | Açıklama |
---|---|---|
EnableLog() | zorunlu | Mesajın yazdırılıp yazdırılmayacağını kontrol eder. |
IsEnabled() | zorunlu | Mevcut günlükçünün etkin durumunu gösterir. |
LogModel() | zorunlu | Modelle ilgili bilgileri kaydet. |
LogEnforce() | zorunlu | Uygulamayla ilgili bilgileri kaydet. |
LogRole() | zorunlu | Rolle ilgili bilgileri kaydet. |
LogPolicy() | zorunlu | Politika 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:
- Model dosyasındaki (.conf) geçersiz sözdizimi.
- Politika dosyasındaki (.csv) geçersiz sözdizimi.
- Depolama adaptörlerinden gelen özel hatalar, örneğin, MySQL bağlantısı başarısız olur.
- Casbin'in hata durumu.
Hatalar veya panikler için bilmeniz gerekebilecek beş ana fonksiyon bulunmaktadır:
Fonksiyon | Hata 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 |
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")