Bỏ qua đến nội dung chính

Log & Error Handling

Nhật ký

Casbin sử dụng log tích hợp sẵn để in nhật ký ra bảng điều khiển theo mặc định, ví dụ:

2017/07/15 19:43:56 [Request: alice, data1, read ---> true]

Nhật ký không được bật theo mặc định. Bạn có thể bật/tắt nó thông qua Enforcer.EnableLog() hoặc tham số cuối cùng của NewEnforcer().

ghi chú

Chúng tôi đã hỗ trợ nhật ký mô hình, yêu cầu ép buộc, vai trò và chính sách trong Golang. Bạn có thể định nghĩa nhật ký riêng của mình để ghi nhật ký Casbin. Nếu bạn đang sử dụng Python, pycasbin tận dụng cơ chế ghi log mặc định của Python. Gói pycasbin thực hiện một cuộc gọi đến logging.getLogger() để thiết lập logger. Không cần cấu hình ghi log đặc biệt ngoài việc khởi tạo logger trong ứng dụng cha. Nếu không có ghi log nào được khởi tạo trong ứng dụng cha, bạn sẽ không thấy bất kỳ thông báo log nào từ pycasbin. Đồng thời, khi bạn bật ghi log trong pycasbin, nó sẽ sử dụng cấu hình log mặc định. Đối với các phần mở rộng pycasbin khác, bạn có thể tham khảo tài liệu ghi log của Django nếu bạn là người dùng Django. Đối với người dùng Python khác, bạn nên tham khảo tài liệu ghi log của Python để cấu hình logger.

Sử dụng các logger khác nhau cho các enforcer khác nhau

Mỗi enforcer có thể có logger riêng của mình để ghi thông tin, và nó có thể được thay đổi trong thời gian chạy.

Và bạn có thể sử dụng một logger thích hợp thông qua tham số cuối cùng của NewEnforcer(). Nếu bạn đang sử dụng cách này để khởi tạo enforcer của mình, bạn không cần sử dụng tham số enabled vì mức độ ưu tiên của trường enabled trong logger là cao hơn.

// Set a default logger as enforcer e1's logger.
// This operation can also be seen as changing the logger of e1 at runtime.
e1.SetLogger(&Log.DefaultLogger{})

// Set another logger as enforcer e2's logger.
e2.SetLogger(&YouOwnLogger)

// Set your logger when initializing enforcer e3.
e3, _ := casbin.NewEnforcer("examples/rbac_model.conf", a, logger)

Loggers được hỗ trợ

Chúng tôi cung cấp một số loggers để giúp bạn ghi lại thông tin.

LoggerTác giảMô tả
Logger mặc định (built-in)CasbinLogger mặc định sử dụng golang log.
Zap loggerCasbinSử dụng zap, cung cấp nhật ký được mã hóa JSON và bạn có thể tùy chỉnh nhiều hơn với zap-logger của riêng mình.

Cách viết một trình ghi nhật ký

Trình ghi nhật ký của bạn nên triển khai giao diện Logger.

Phương thứcKiểuMô tả
EnableLog()bắt buộcKiểm soát việc in thông điệp.
IsEnabled()bắt buộcHiển thị trạng thái kích hoạt hiện tại của trình ghi nhật ký.
LogModel()bắt buộcGhi lại thông tin liên quan đến mô hình.
LogEnforce()bắt buộcGhi lại thông tin liên quan đến việc thực thi.
LogRole()bắt buộcGhi lại thông tin liên quan đến vai trò.
LogPolicy()bắt buộcGhi lại thông tin liên quan đến chính sách.

Bạn có thể truyền logger tùy chỉnh của mình vào Enforcer.SetLogger().

Đây là một ví dụ về cách tùy chỉnh một logger cho 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)
}

Xử lý lỗi

Lỗi hoặc sự cố có thể xảy ra khi bạn sử dụng Casbin vì những lý do như:

  1. Cú pháp không hợp lệ trong tệp mô hình (.conf).
  2. Cú pháp không hợp lệ trong tệp chính sách (.csv).
  3. Lỗi tùy chỉnh từ các bộ điều hợp lưu trữ, ví dụ: MySQL không thể kết nối.
  4. Lỗi từ Casbin.

Có năm chức năng chính mà bạn có thể cần phải biết để xử lý lỗi hoặc sự cố:

Chức năngHành vi khi gặp lỗi
NewEnforcer()Trả về một lỗi
LoadModel()Trả về một lỗi
LoadPolicy()Trả về một lỗi
SavePolicy()Trả về một lỗi
Enforce()Trả về một lỗi
ghi chú

NewEnforcer() gọi LoadModel()LoadPolicy() bên trong. Vì vậy, bạn không cần phải gọi hai hàm sau khi sử dụng NewEnforcer().

Bật và tắt

Bộ thực thi có thể được tắt thông qua hàm Enforcer.EnableEnforce(). Khi nó bị tắt, Enforcer.Enforce() sẽ luôn trả về true. Các thao tác khác như thêm hoặc xóa chính sách không bị ảnh hưởng. Đây là một ví dụ:

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

// Will return false.
// By default, the enforcer is enabled.
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")