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