Zum Hauptinhalt springen

Log- & Fehlerbehandlung

ProtokollierungÔÇő

Kasbin verwendet das eingebaute Log um Logs standardm├Ą├čig auf die Konsole zu drucken, wie:

2017/07/15 19:43:56 [Anfrage: alice, data1, lesen Sie ---> true]

Die Protokollierung ist standardm├Ą├čig nicht aktiviert. Sie k├Ânnen es ├╝ber Enforcer.EnableLog() oder den letzten Parameter von NewEnforcer() umschalten.

note

Wir unterst├╝tzen bereits die Protokollierung des Modells, Forderung, Rolle, Politik in Golang. Sie k├Ânnen Ihr eigenes Log f├╝r die Protokollierung von Casbin festlegen. Wenn du Python verwendest, nutzt Pycasbin den standardm├Ą├čigen Python-Logging-Mechanismus. Das pycasbin-Paket ruft auf logging.getLogger() auf, um den Logger zu setzen. Eine spezielle Protokollkonfiguration wird au├čer der Initialisierung des Loggers in der ├╝bergeordneten Anwendung ben├Âtigt. Wenn keine Protokollierung innerhalb der ├╝bergeordneten Anwendung intiliziert ist, werden keine Logmeldungen von pycasbin angezeigt.

Verwende verschiedene Protokolle f├╝r unterschiedliche DurchsetzerÔÇő

Jeder Vollstrecker kann seinen eigenen Logger haben, der Informationen protokolliert und zur Laufzeit ge├Ąndert werden kann.

Und Sie k├Ânnen einen richtigen Logger ├╝ber den letzten Parameter von NewEnforcer()verwenden, wenn Sie auf diese Weise Ihre Durchsetzung initialisieren, Sie m├╝ssen den aktivierten Parameter nicht verwenden, da die Priorit├Ąt des aktivierten Feldes im Logger h├Âher ist.

// Standardlogger als Enforcer e1 Logger festlegen.
// Dieser Vorgang kann auch als Änderung des Loggers von e1 zur Laufzeit angesehen werden.
e1.SetLogger(&Log.DefaultLogger{})

// Einen anderen Logger als Enforcer e2's Logger setzen.
e2.SetLogger(&YouOwnLogger)

// Legen Sie Ihren Logger fest, wenn Sie den Durchsetzer e3 initialisieren.
e3, _ := casbin.NewEnforcer("examples/rbac_model.conf", a, logger)

Unterst├╝tzte LoggerÔÇő

Wir stellen Ihnen einige Logger zur Verf├╝gung, die Ihnen beim Loggen helfen.

LoggerAutorBeschreibung
Standard Logger (eingebaut)CasbinDer Standard-Logger mit golang-Log.
Zap loggerCasbinVerwende zap, gib json kodiertes Log an und du kannst mehr mit deinem eigenen zap-logger anpassen.

Wie man einen Logger schreibtÔÇő

Ihr Logger sollte die Logger Schnittstelle implementieren.

MethodeTypBeschreibung
EnableLog()mandatoryLegen Sie fest, ob die Nachricht gedruckt wird.
Isaktiviert()mandatoryZeigt den aktuellen Status des Loggers an.
LogModel()mandatoryLogin-Informationen zum Modell.
LogEnforce()mandatoryLogin-Informationen im Zusammenhang mit der Durchsetzung.
LogRole()mandatoryLog-Info in Bezug auf die Rolle.
LogPolicy()mandatoryLog-Informationen in Bezug auf Richtlinien.

Sie k├Ânnen Ihren benutzerdefinierten -Logger an Enforcer.SetLogger() ├╝bergeben.

Hier ist ein Beispiel daf├╝r, wie man einen Logger f├╝r Golang anpassen kann:

import (
"fmt"
"log"
"strings"
)

// DefaultLogger ist die Implementierung f├╝r einen Logger mit golang-Protokoll.
type DefaultLogger struct {
enabled bool
}

func (l *DefaultLogger) EnableLog(enable bool) {
l. nabled = enable
}

func (l *StandardLogger) IsEnabled() bool {
return l.enabled
}

func (l *Standardlogger) LogModel(model [][]string) {
if !l. nabled {
return
}
var str strings.Builder
str. riteString("Model: ")
f├╝r _, v := range model {
str. riteString(fmt.Sprintf("%v\n", v))
}

log.Println(str. tring())
}

func (l *StandardLogger) LogEnforce(Matcher string, request []interface{}, result bool, erkl├Ąrt [][][]string) {
if !l. nabled {
return
}

var reqStr strings.Builder
reqStr. riteString("Anfrage: ")
f├╝r i, rval := range request {
if i ! len(request)-1 {
reqStr. riteString(fmt. printf("%v, ", rval))
} else {
reqStr. riteString(fmt. printf("%v", rval))
}
}
reqStr. riteString(fmt.Sprintf(" ---> %t\n", result))

reqStr. riteString("Trefferrichtlinie: ")
f├╝r i, pval := range erkl├Ąrt {
if i ! len(explains)-1 {
reqStr. riteString(fmt. printf("%v, ", pval))
} else {
reqStr. riteString(fmt. printf("%v \n", pval))
}
}

Log. rintln(reqStr. tring())
}

func (l *DefaultLogger) LogPolicy(policy map[string][][]string) {
if !l. nabled {
return
}

var str strings. uilder
str. riteString("Policy: ")
f├╝r k, v := range policy {
str.WriteString(fmt. printf("%s : %v\n", k, v))
}

log.Println(str. tring())
}

func (l *DefaultLogger) LogRole(roles []string) {
if !l. nabled {
return
}

log.Println("Rolen: ", Rollen)
}

FehlerbehandlungÔÇő

Fehler oder Panik k├Ânnen auftreten, wenn Sie Casbin aus Gr├╝nden wie z. B.:

  1. Ung├╝ltige Syntax in der Modelldatei (.conf).
  2. Ung├╝ltige Syntax in Richtlinien-Datei (.csv).
  3. Benutzerdefinierter Fehler von Speicheradaptern, z. B. MySQL kann sich nicht verbinden.
  4. Casbin's bug.

Es gibt f├╝nf Hauptfunktionen, die Sie f├╝r Fehler oder Panik sorgen k├Ânnen:

FunktionVerhalten bei Fehler
NewEnforcer()Retourenfehler
LoadModel()Retourenfehler
LoadPolicy()Retourenfehler
SavePolicy()Retourenfehler
Enforce()Retourenfehler
note

NewEnforcer() ruft LoadModel() und LoadPolicy() in auf. Sie m├╝ssen also die beiden letzten Aufrufe nicht aufrufen, wenn Sie NewEnforcer() verwenden.

& deaktivierenÔÇő

Der Vollstrecker kann ├╝ber die Funktion Enforcer.EnableEnforce() deaktiviert werden. Enforcer.Enforce() wird immer true zur├╝ckgeben. Andere Operationen wie das Hinzuf├╝gen oder Entfernen von Richtlinien sind nicht betroffen. Hier ist ein Beispiel:

e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")

// Gibt Falsch zur├╝ck.
// Standardm├Ą├čig ist der Vollstrecker aktiviert.
e.Enforce("non-authorized-user", "data1", "read")

// // Enforcer zur Laufzeit deaktivieren.
e.EnableEnforce(false)

// Gibt true f├╝r jede Anfrage zur├╝ck.
e.Enforce("non-authorized-user", "data1", "read")

// Aktivieren Sie den Vollstrecker erneut.
e.EnableEnforce(true)

// Gibt Falsch zur├╝ck.
e.Enforce("non-authorized-user", "data1", "read")