Logs.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package models
  2. import (
  3. "errors"
  4. "sync/atomic"
  5. "time"
  6. "github.com/beego/beego/v2/client/orm"
  7. "github.com/mindoc-org/mindoc/conf"
  8. )
  9. var loggerQueue = &logQueue{channel: make(chan *Logger, 100), isRuning: 0}
  10. type logQueue struct {
  11. channel chan *Logger
  12. isRuning int32
  13. }
  14. // Logger struct .
  15. type Logger struct {
  16. LoggerId int64 `orm:"pk;auto;unique;column(log_id)" json:"log_id"`
  17. MemberId int `orm:"column(member_id);type(int)" json:"member_id"`
  18. // 日志类别:operate 操作日志/ system 系统日志/ exception 异常日志 / document 文档操作日志
  19. Category string `orm:"column(category);size(255);default(operate)" json:"category"`
  20. Content string `orm:"column(content);type(text)" json:"content"`
  21. OriginalData string `orm:"column(original_data);type(text)" json:"original_data"`
  22. PresentData string `orm:"column(present_data);type(text)" json:"present_data"`
  23. CreateTime time.Time `orm:"type(datetime);column(create_time);auto_now_add" json:"create_time"`
  24. UserAgent string `orm:"column(user_agent);size(500)" json:"user_agent"`
  25. IPAddress string `orm:"column(ip_address);size(255)" json:"ip_address"`
  26. }
  27. // TableName 获取对应数据库表名.
  28. func (m *Logger) TableName() string {
  29. return "logs"
  30. }
  31. // TableEngine 获取数据使用的引擎.
  32. func (m *Logger) TableEngine() string {
  33. return "INNODB"
  34. }
  35. func (m *Logger) TableNameWithPrefix() string {
  36. return conf.GetDatabasePrefix() + m.TableName()
  37. }
  38. func NewLogger() *Logger {
  39. return &Logger{}
  40. }
  41. func (m *Logger) Add() error {
  42. if m.MemberId <= 0 {
  43. return errors.New("用户ID不能为空")
  44. }
  45. if m.Category == "" {
  46. m.Category = "system"
  47. }
  48. if m.Content == "" {
  49. return errors.New("日志内容不能为空")
  50. }
  51. loggerQueue.channel <- m
  52. if atomic.LoadInt32(&(loggerQueue.isRuning)) <= 0 {
  53. atomic.AddInt32(&(loggerQueue.isRuning), 1)
  54. go addLoggerAsync()
  55. }
  56. return nil
  57. }
  58. func addLoggerAsync() {
  59. defer atomic.AddInt32(&(loggerQueue.isRuning), -1)
  60. o := orm.NewOrm()
  61. for {
  62. logger := <-loggerQueue.channel
  63. o.Insert(logger)
  64. }
  65. }