Log- & Fehlerbehandlung
Protokollierung
Casbin uses the built-in log
to print logs to the console by default, like:
2017/07/15 19:43:56 [Anfrage: alice, data1, lesen Sie ---> true]
Logging is not enabled by default. Sie können es über Enforcer.EnableLog()
oder den letzten Parameter von NewEnforcer()
umschalten.
We already support logging the model, enforce request, role, and policy 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. The pycasbin package makes a call to logging.getLogger()
to set the logger. Eine spezielle Protokollkonfiguration wird außer der Initialisierung des Loggers in der übergeordneten Anwendung benötigt. If no logging is initialized within the parent application, you will not see any log messages from pycasbin. At the same time, when you enable log in pycasbin, it will use the default log configuration. For other pycasbin extensions, you can refer to the Django logging docs if you are a Django user. For other Python users, you should refer to the Python logging docs to configure the logger. :::
Use different loggers for different enforcers
Every enforcer can have its own logger to log information, and it can be changed at runtime.
And you can use a proper logger via the last parameter of NewEnforcer()
. If you are using this way to initialize your enforcer, you don't need to use the enabled parameter because the priority of the enabled field in the logger is higher.
// Standardlogger als Enforcer e1 Logger festlegen.
// This operation can also be seen as changing the logger of e1 at runtime.
e1.SetLogger(&Log.DefaultLogger{})
// Einen anderen Logger als Enforcer e2's Logger setzen.
e2.SetLogger(&YouOwnLogger)
// Set your logger when initializing enforcer e3.
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.
- Go
- PHP
Logger | Autor | Beschreibung |
---|---|---|
Default logger (built-in) | Casbin | Der Standard-Logger mit golang-Log. |
Zap logger | Casbin | Using zap, provide json encoded log and you can customize more with your own zap-logger. |
Logger | Autor | Beschreibung |
---|---|---|
psr3-bridge Logger | Casbin | Bietet eine PSR-3 konforme Brücke. |
Wie man einen Logger schreibt
Ihr Logger sollte die Logger Schnittstelle implementieren.
Methode | Typ | Beschreibung |
---|---|---|
EnableLog() | mandatory | Control whether to print the message. |
Isaktiviert() | mandatory | Zeigt den aktuellen Status des Loggers an. |
LogModel() | mandatory | Log info related to the model. |
LogEnforce() | mandatory | Log info related to enforcing. |
LogRole() | mandatory | Log info related to the role. |
LogPolicy() | mandatory | Log info related to the policy. |
Sie können Ihren benutzerdefinierten -Logger
an Enforcer.SetLogger()
übergeben.
Here is an example of how to customize a logger for Golang:
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
Errors or panics may occur when you use Casbin for reasons like:
- Invalid syntax in the model file (.conf).
- Invalid syntax in the policy file (.csv).
- Custom errors from storage adapters, e.g., MySQL fails to connect.
- Casbin's bug.
There are five main functions you may need to be aware of for errors or panics:
Funktion | Verhalten bei Fehler |
---|---|
NewEnforcer() | Returns an error |
LoadModel() | Returns an error |
LoadPolicy() | Returns an error |
SavePolicy() | Returns an error |
Enforce() | Returns an error |
NewEnforcer()
calls LoadModel()
and LoadPolicy()
internally. So you don't have to call the latter two when using NewEnforcer()
.
:::
Enable and disable
Der Vollstrecker kann über die Funktion Enforcer.EnableEnforce()
deaktiviert werden. Enforcer.Enforce()
wird immer true
zurückgeben. Other operations like adding or removing policies are not affected. 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")
// Disable the enforcer at runtime.
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")