go连接mysql,redis并完成日志字符处理实例
来源:互联网 发布:windows域服务器管理 编辑:程序博客网 时间:2024/06/06 00:55
go连接mysql,redis并完成日志字符处理实例
package main// 引入所需包import ( "compress/gzip" "fmt" "io/ioutil" "os" "strings" //"reflect" "github.com/garyburd/redigo/redis" "math" "strconv" "net/url" "time" "database/sql" _ "github.com/go-sql-driver/mysql")//获取指定目录下的所有gz文件,包含子目录下的gz文件func GetGzFiles(dirPth string) (files []string, err error) { var dirs []string dir, err := ioutil.ReadDir(dirPth) if err != nil { return nil, err } PthSep := string(os.PathSeparator) //suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写 for _, fi := range dir { if fi.IsDir() { // 目录, 递归遍历 dirs = append(dirs, dirPth+PthSep+fi.Name()) GetGzFiles(dirPth + PthSep + fi.Name()) } else { // 过滤指定格式<.gz文件> ok := strings.HasSuffix(fi.Name(), ".gz") if ok { files = append(files, dirPth+PthSep+fi.Name()) } } } // 读取子目录下文件 for _, dir := range dirs { tmpFiles, _ := GetGzFiles(dir) for _, file := range tmpFiles { files = append(files, file) } } return files, nil}/*需要记录的值包括: 访问时间,日期,状态码,cache返回的状态码,缓存状态码,源站返回状态码,节点IP,客户端IP,响应时间,故障原因故障原因包括: (1)nginx连接cache超时(2)nginx读取cache响应头超时(3)nginx产生的其它异常(4)cache连接源站失败(5)cache缓存住的错误码(6)cache上层返回的错误码(7)cache给出的其它异常(8)其它异常*/type ResInfo struct { id int // 唯一ID timestamp int64 // 访问时间 date string// 日期 dnid int // 域名ID resocde int // 状态码,206 cacheCode int // cache返回的状态码,200 upstreamHttpStatus string // 缓存状态码,HIT sourceCode int // 源站返回状态码,200 errorCode int // 故障原因,0-9 clientIp string // 客户端IP serverIp string // 节点IP reponseTime float64 // 响应时间}var id int = 0func main() { // 更新域名列表 db, err := sql.Open("mysql", "user:passwd@tcp(127.0.0.1:65000)/server_conf?charset=utf8") if err != nil { fmt.Printf("connect mysql failed! [%s]", err) return } else { fmt.Println("connect mysql ok!") } rows, err := db.Query("SELECT d_id, d_dname FROM domain") if err != nil { fmt.Printf("select failed! [%s]", err) return } var mapDomain map[string]int mapDomain = make(map[string]int) for rows.Next() { var d_id int var d_dname string rows.Columns() err = rows.Scan(&d_id, &d_dname) if err != nil { fmt.Printf("Get domain info failed! [%s]", err) } mapDomain[d_dname] = d_id } //for k, v := range mapDomain { // fmt.Println(k, v) //} // 读取待处理的文件 files, _ := GetGzFiles("./gzfiles") var ResInfoList []ResInfo for _, fn := range files { fmt.Printf("开始处理日志文件[%s]\n", fn) // 打开本地gz格式压缩包 fr, err := os.Open(fn) if err != nil { panic(err) } else { println("open file success!") } // defer: 在函数退出时,执行关闭文件 defer fr.Close() // 创建gzip文件读取对象 gr, err := gzip.NewReader(fr) if err != nil { panic(err) } // defer: 在函数退出时,执行关闭gzip对象 defer gr.Close() // 读取gzip对象内容 rBuf, err := ioutil.ReadAll(gr) if err != nil { fmt.Println("[read gzip data err]: ", err) } // []uint8转string // fmt.Println(reflect.TypeOf(rBuf)) strBuf := string(rBuf) bufList := strings.Split(strBuf, "\n") for _, strLine := range bufList { if len(strLine) == 0 { continue } var dnid int var errorCode int var timestamp int64 var resocde int var cacheCode int var sourceCode int var reponseTime float64 var date string var clientIp string var serverIp string var upstreamHttpStatus string var userDefineList []string fragList := strings.Split(strLine, "\t") for i, strFrag := range fragList { if i == 0 { strTemp := strings.Split(strFrag, "/") clientIp = strTemp[0] fmt.Printf("clientIp=%v\n", clientIp) } else if i == 1 { tmp, _ := strconv.ParseFloat(strFrag, 64) timestamp = int64(math.Trunc(tmp))/60*60 fmt.Printf("timestamp=%v\n", timestamp) tm := time.Unix(timestamp, 0) date = tm.Format("20060102") } else if i == 4 { resocde, _ = strconv.Atoi(strFrag) fmt.Printf("resocde=%v\n", resocde) } else if i == 5 { upstreamHttpStatus = strFrag fmt.Printf("upstreamHttpStatus=%v\n", upstreamHttpStatus) } else if i == 8 { strTemp := strFrag u, err := url.Parse(strTemp) if err != nil { panic(err) } fmt.Printf("url=%v\n", u.Host) // 获取url的dnid if v, ok := mapDomain[u.Host]; ok { dnid = v } else { fmt.Printf("Domain Not Found!") } } else if i == 13 { serverIp = strFrag fmt.Printf("serverIp=%v\n", serverIp) } else if i == 17 { reponseTime, _ = strconv.ParseFloat(strFrag, 64) fmt.Printf("reponseTime=%v\n", reponseTime) } else if i == 29 { //fmt.Printf("%s \t", strFrag) userDefineList = strings.Split(strFrag, "/") for i, strDefine := range userDefineList { if i == 5 { cacheCode, _ = strconv.Atoi(strDefine) //fmt.Printf("cacheCode=%v \n", cacheCode) //fmt.Println(reflect.TypeOf(cacheCode)) } } //fmt.Printf("%v \t %v \n", timestamp, cacheCode) } } errorCode = 9 id++ info := ResInfo{id,timestamp,date,dnid,resocde,cacheCode,upstreamHttpStatus,sourceCode,errorCode,clientIp,serverIp,reponseTime} //fmt.Printf("%v\n", info) ResInfoList = append(ResInfoList, info) } break } // 入redis库 // 连接redis数据库,指定数据库的IP和端口 conn, err := redis.Dial("tcp", "127.0.0.1:65000") if err != nil { fmt.Println("Connect to redis error", err) return } else { fmt.Println("Connect to redis ok.") } // 函数退出时关闭连接 defer conn.Close() // redis授权登陆 conn.Do("AUTH", "xxxxxx") // 遍历列表并写入redis fmt.Printf("list len=%v\n", len(ResInfoList)) var tm int64 = 0 for _, info := range ResInfoList { //fmt.Printf("%v \n", info) tm = info.timestamp // 执行List插入 _, err = conn.Do("LPUSH", info.timestamp, info) if err != nil { fmt.Println("redis push list failed:", err) } else { //fmt.Println("redis lpush ok!") } break } // 读取List infoList, err := redis.Strings(conn.Do("LRANGE", tm, 0, -1)) if err != nil { fmt.Println("redis get list failed:", err) } for _, info := range infoList { fmt.Printf("values: %v\n", info) }}
阅读全文
0 0
- go连接mysql,redis并完成日志字符处理实例
- go 语言 连接mysql(简单实例)
- Redigo--Go连接Redis
- go语言连接redis
- Redigo--Go连接Redis
- go连接redis
- go 连接 mysql 数据库
- go连接mysql数据库
- go连接mysql
- go连接mysql数据库
- Redis连接实例
- redis连接池实例
- PHP 连接并操作MySQL的一个实例
- 使用GO连接MYSQL数据库
- stringstream分割字符并完成类型转换
- 远程连接并操作redis
- redis集群连接池实例
- Redis(五)Java连接Redis实例
- 移动端适配方案
- pyspark rdd def partitionBy自定义partitionFunc
- 十大Python机器学习开源项目
- 如何站在巨人的肩膀上,将自己的产品赋予AI的能力?百度UNIT
- 【策略英雄榜】一起来发现最优秀的策略吧
- go连接mysql,redis并完成日志字符处理实例
- 表单验证
- 保证三个线程依次按顺序执行
- 使用HTML5+CSS+JS框架有那些好处
- 加解密
- 在Linux中创建静态库.a和动态库.so
- shiro权限框架简单入门demo
- Mac Apache 配置二级域名
- Linux下分卷压缩和解压