Журнал & Обработка ошибок
Ведение журнала
Casbin uses the built-in log
to print logs to the console by default, like:
2017/07/15 19:43:56 [Запрос: аль, данные1, чтение ---> true]
Logging is not enabled by default. Вы можете переключить его через Enforcer.EnableLog()
или последний параметр NewEnforcer()
.
::note
We already support logging the model, enforce request, role, and policy in Golang. Вы можете определить свой собственный лог для входа в Casbin. Если вы используете Python, pycasbin использует стандартный механизм записи логов Python. The pycasbin package makes a call to logging.getLogger()
to set the logger. Не требуется никакой специальной настройки ведения журнала, кроме инициализации логгера в родительском приложении. 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.
// Установлен логгер по умолчанию как логгер e1.
// This operation can also be seen as changing the logger of e1 at runtime.
e1.SetLogger(&Log.DefaultLogger{})
// Установить другой логгер в качестве журналиста e2.
e2.SetLogger(&YouOwnLogger)
// Set your logger when initializing enforcer e3.
e3, _ := casbin.NewEnforcer("Пример/rbac_model.conf", a, logger)
Поддерживаемые логгеры
Мы предоставляем некоторые логгеры, чтобы помочь вам зарегистрировать информацию.
- Go
- PHP
Logger | Автор | Описание |
---|---|---|
Default logger (built-in) | Casbin | Логгер по умолчанию, используя golang log. |
Zap logger | Casbin | Using zap, provide json encoded log and you can customize more with your own zap-logger. |
Logger | Автор | Описание |
---|---|---|
logger psr3-bridge | Casbin | Предоставляет совместимый с PSR-3 мост. |
Как записать логгер
Ваш логгер должен реализовать интерфейс Logger.
Метод | Тип | Описание |
---|---|---|
EnableLog() | mandatory | Control whether to print the message. |
Включено () | mandatory | Показывать статус текущего логгера. |
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. |
Вы можете передать свой лог
Enforcer.SetLogger()
.
Here is an example of how to customize a logger for Golang:
импорт (
"fmt"
"log"
"strings"
)
// DefaultLogger - реализация для журнала с использованием golang log.
type DefaultLogger struct {
enabled bool
}
func (l *DefaultLogger) EnableLog(enable bool) {
l. nabled = enable
}
func (l *DefaultLogger) IsEnabled() bool {
return l.enabled
}
func (l *DefaultLogger) LogModel(model [][]string) {
if !l. nabled {
return
}
var str strings.Builder
str. riteString("Модель: ")
для _, v := range model {
str. riteString(fmt.Sprintf("%v\n", v))
}
log.Println(str. tring())
}
func (l *DefaultLogger) LogEnforce(matcher string, request []interface{}, result bool, explains [][]string) {
if !l. nabled {
return
}
var reqStr strings.Builder
reqStr. riteString("Запрос: ")
для i, rval := 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", результат))
reqStr. riteString("Политика хитов: ")
для i, pval := range объясняет {
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 строк. uilder
str. riteString("Политика: ")
для 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("Роли: ", роли)
}
Обработка ошибок
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:
Функция | Поведение при ошибке |
---|---|
NewEnforcer() | Returns an error |
LoadModel() | Returns an error |
LoadPolicy() | Returns an error |
Сохранение политики () | Returns an error |
Enforce() | Returns an error |
::note
NewEnforcer()
calls LoadModel()
and LoadPolicy()
internally. So you don't have to call the latter two when using NewEnforcer()
.
:::
Enable and disable
Силор может быть отключен через функцию Enforcer.EnableEnforce()
. Когда он отключен, Enforcer.Enforce()
всегда возвращает true
. Other operations like adding or removing policies are not affected. Вот пример:
e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
// вернет false.
// По умолчанию, энсилиар включен.
e.Enforce("non-authorized-user", "data1", "read")
// Disable the enforcer at runtime.
e.EnableEnforce(false)
// Возвращает истину за любой запрос.
e.Enforce("non-authorized-user", "data1", "read")
// Повторяйте вкл.
e.EnableEnforce(true)
// Возвращает false.
e.Enforce("non-authorized-user", "data1", "read")