zhangzengfei
2023-10-30 6a3410ffa6e8c06d7f502cdbf34a7830bfe50d99
修改gorm log, 添加集群状态判断, 默认开启
2个文件已修改
136 ■■■■ 已修改文件
serf/sqlite.go 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
serf/sync.go 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
serf/sqlite.go
@@ -1,10 +1,8 @@
package serf
import (
    "apsClient/pkg/logx"
    "errors"
    "fmt"
    "regexp"
    "strings"
    "github.com/jinzhu/gorm"
@@ -76,61 +74,4 @@
    }
    return nil, errors.New("tableNames is nil")
}
type DbLogger struct {
}
func (dbLogger *DbLogger) Print(values ...interface{}) {
    var (
        level = values[0]
    )
    fmt.Println("dblogger", values)
    if level == "sql" {
        msgArr := gorm.LogFormatter(values...)
        sql := msgArr[3].(string)
        logx.Infof("sql: %v", sql)
        sql = strings.TrimPrefix(sql, " ")
        if !strings.HasPrefix(sql, "SELECT") && !strings.HasPrefix(sql, "select") && !strings.Contains(sql, "PRAGMA") && !strings.Contains(sql, "pragma") {
            affected := values[5].(int64)
            if affected > 0 { //执行成功
                //判断操作的是哪张表
                whereIdx := strings.Index(sql, "WHERE")
                sqlWithTable := sql
                if whereIdx > -1 {
                    sqlWithTable = sql[:whereIdx]
                }
                fmt.Println("判断是哪张表 sqlWithTable:", sqlWithTable)
                insertReg := regexp.MustCompile(`^\s*(?i:insert)\s`) //insert
                updateReg := regexp.MustCompile(`^\s*(?i:update)\s`) //update
                delReg := regexp.MustCompile(`^\s*(?i:delete)\s`)    //delete
                if insertReg.MatchString(sqlWithTable) {
                    fmt.Println("插入操作")
                    for _, t := range agent.syncTables {
                        reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`)
                        if reg.MatchString(sqlWithTable) {
                            fmt.Println("属于同步表:", t)
                            syncSqlChan <- sql
                        }
                    }
                } else if updateReg.MatchString(sqlWithTable) || delReg.MatchString(sqlWithTable) {
                    fmt.Println("删除或者更新")
                    for _, t := range agent.syncTables {
                        reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`)
                        if reg.MatchString(sqlWithTable) {
                            fmt.Println("属于同步表:", t)
                            syncSqlChan <- sql
                        }
                    }
                }
            }
        }
    } else {
        fmt.Println("dbLogger level!=sql")
    }
}
serf/sync.go
@@ -7,6 +7,7 @@
    "fmt"
    "os"
    "os/signal"
    "regexp"
    "strings"
    "syscall"
    "time"
@@ -65,9 +66,10 @@
    agent.queryTableTopic = procName + "/serf/query/sqls"
    // 设置日志回调
    db.SetLogger(&DbLogger{})
    db.SetLogger(&agent)
    // 先关闭日志
    db.LogMode(false)
    //db.LogMode(false)
    return &agent
}
@@ -153,7 +155,7 @@
    ss.QueryClusterStat()
    //if ss.ClusterStatus != "" {
    ss.sqlDB.LogMode(true)
    //ss.sqlDB.LogMode(true)
    //}
    initChan <- true
@@ -239,28 +241,28 @@
                        // 创建集群, 开启日志跟踪, 设置角色master
                        ss.clusterEventFn(EventCreateCluster)
                        ss.ClusterStatus = "master"
                        ss.sqlDB.LogMode(true)
                        //ss.sqlDB.LogMode(true)
                    case "join":
                        // 加入集群, 开启日志跟踪, 设置角色slave
                        ss.clusterEventFn(EventJoinCluster)
                        ss.onJoinCluster()
                        ss.ClusterStatus = "slave"
                        ss.sqlDB.LogMode(true)
                        //ss.sqlDB.LogMode(true)
                    case "leave":
                        // 退出集群, 开启日志跟踪, 设置角色slave
                        ss.clusterEventFn(EventLeaveCluster)
                        ss.ClusterStatus = ""
                        ss.sqlDB.LogMode(true)
                        //ss.sqlDB.LogMode(true)
                    case "slave2master":
                        ss.clusterEventFn(EventSlave2Master)
                        ss.ClusterStatus = "master"
                        ss.sqlDB.LogMode(true)
                        //ss.sqlDB.LogMode(true)
                    case "master2slave":
                        ss.clusterEventFn(EventMaster2Slave)
                        ss.ClusterStatus = "slave"
                        ss.sqlDB.LogMode(true)
                        //ss.sqlDB.LogMode(true)
                    }
                }
            }
@@ -437,6 +439,65 @@
    return err
}
func (ss *SyncServer)Print(values ...interface{}) {
    var (
        level = values[0]
    )
    //fmt.Println("dblogger", values)
    if level == "sql" {
        msgArr := gorm.LogFormatter(values...)
        sql := msgArr[3].(string)
        logx.Infof("sql: %v", sql)
        sql = strings.TrimPrefix(sql, " ")
        if !strings.HasPrefix(sql, "SELECT") && !strings.HasPrefix(sql, "select") && !strings.Contains(sql, "PRAGMA") && !strings.Contains(sql, "pragma") {
            affected := values[5].(int64)
            if affected > 0 { //执行成功
                //判断操作的是哪张表
                whereIdx := strings.Index(sql, "WHERE")
                sqlWithTable := sql
                if whereIdx > -1 {
                    sqlWithTable = sql[:whereIdx]
                }
                //fmt.Println("判断是哪张表 sqlWithTable:", sqlWithTable)
                insertReg := regexp.MustCompile(`^\s*(?i:insert)\s`) //insert
                updateReg := regexp.MustCompile(`^\s*(?i:update)\s`) //update
                delReg := regexp.MustCompile(`^\s*(?i:delete)\s`)    //delete
                if insertReg.MatchString(sqlWithTable) {
                    //fmt.Println("插入操作")
                    for _, t := range agent.syncTables {
                        reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`)
                        if reg.MatchString(sqlWithTable) {
                            //fmt.Println("属于同步表:", t)
                            // 判断是在集群内, 同步消息, 判断两种角色, 为避免其他出现状态
                            if ss.ClusterStatus == "master" || ss.ClusterStatus == "slave" {
                                syncSqlChan <- sql
                            }
                        }
                    }
                } else if updateReg.MatchString(sqlWithTable) || delReg.MatchString(sqlWithTable) {
                    //fmt.Println("删除或者更新")
                    for _, t := range agent.syncTables {
                        reg := regexp.MustCompile(`\s+\"?(?i:` + t + `)\"?\s+`)
                        if reg.MatchString(sqlWithTable) {
                            //fmt.Println("属于同步表:", t)
                            if ss.ClusterStatus == "master" || ss.ClusterStatus == "slave" {
                                syncSqlChan <- sql
                            }
                        }
                    }
                }
            }
        }
    } else {
        fmt.Println("dbLogger level!=sql")
    }
}
func arrayContains(list []string, arr []string) string {
    if arr == nil || list == nil {
        return ""