ログ & エラー処理
ログ
Casbin uses the built-in log
to print logs to the console by default, like:
2017/07/15 19:43:56 [Request: alice, data1, read ---> true]
Logging is not enabled by default. Enforcer.EnableLog()
または NewEnforcer()
の最後のパラメータで切り替えることができます。
We already support logging the model, enforce request, role, and policy in Golang. ログを記録するための独自のログを定義することができます。 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.
// Set a default logger as enforcer e1's logger. (Automatic Copy)
// This operation can also be seen as changing the logger of e1 at runtime.
e1.SetLogger(&Log.DefaultLogger{})
// Enforcer e2 のロガーとして別のロガーを設定します。
e2.SetLogger(&YouOwnLogger)
// Set your logger when initializing enforcer e3.
e3, _ := casbin.NewEnforcer("examples/rbac_model.conf", a, logger)
サポートされているロガー
私たちはあなたが情報をログに記録するのを助けるためにいくつかのロガーを提供しています。
- Go
- PHP
Logger | 作成者 | 説明 |
---|---|---|
Default logger (built-in) | Casbin | golangログを使用するデフォルトのロガー。 |
Zap logger | Casbin | Using zap, provide json encoded log and you can customize more with your own zap-logger. |
Logger | 作成者 | 説明 |
---|---|---|
psr3-bridge logger | Casbin | PSR-3 準拠のブリッジを提供します。 |
ロガーの書き込み方法
ロガーは Logger インターフェイスを実装する必要があります。
方法 | タイプ | 説明 |
---|---|---|
EnableLog() | mandatory | Control whether to print the message. |
IsEnabled() | 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:
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)
}
エラー処理
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 |
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
エンフォーサーは 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")
// Will return false.
// デフォルトでは、エンフォーサーは有効です。
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")