package models import ( "encoding/json" "github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/dbs" timeutil "github.com/iwind/TeaGo/utils/time" "strings" "time" ) type HTTPAccessLogDAO dbs.DAO var SharedHTTPAccessLogDAO = NewHTTPAccessLogDAO() func NewHTTPAccessLogDAO() *HTTPAccessLogDAO { return dbs.NewDAO(&HTTPAccessLogDAO{ DAOObject: dbs.DAOObject{ DB: Tea.Env, Table: "edgeHTTPAccessLogs", Model: new(HTTPAccessLog), PkName: "id", }, }).(*HTTPAccessLogDAO) } // 创建访问日志 func CreateHTTPAccessLogs(accessLogs []*pb.HTTPAccessLog) error { dao := randomAccessLogDAO() if dao == nil { dao = SharedHTTPAccessLogDAO } return CreateHTTPAccessLogsWithDAO(dao, accessLogs) } // 使用特定的DAO创建访问日志 func CreateHTTPAccessLogsWithDAO(dao *HTTPAccessLogDAO, accessLogs []*pb.HTTPAccessLog) error { if dao == nil { return errors.New("dao should not be nil") } if len(accessLogs) == 0 { return nil } // TODO 改成事务批量提交,以加快速度 for _, accessLog := range accessLogs { day := timeutil.Format("Ymd", time.Unix(accessLog.Timestamp, 0)) table, err := findAccessLogTable(dao.Instance, day, false) if err != nil { return err } fields := map[string]interface{}{} fields["serverId"] = accessLog.ServerId fields["nodeId"] = accessLog.NodeId fields["status"] = accessLog.Status fields["createdAt"] = accessLog.Timestamp fields["day"] = day content, err := json.Marshal(accessLog) if err != nil { return err } fields["content"] = content _, err = dao.Query(). Table(table). Sets(fields). Insert() if err != nil { // 是否为 Error 1146: Table 'xxx.xxx' doesn't exist 如果是,则创建表之后重试 if strings.Contains(err.Error(), "1146") { table, err = findAccessLogTable(dao.Instance, day, true) if err != nil { return err } _, err = dao.Query(). Table(table). Sets(fields). Insert() if err != nil { return err } } } } return nil }