解析log:
下载需要解析的log
wget https://gist.githubusercontent.com/clanchun/2b5e07cda53718ccbf64f62fb31900c8/raw/64be7f018973717dd5faa7be2bfb817f50ed05bb/access.log
package main import ( "bufio" "io" "os" "fmt" "regexp" "strings" ) var ( filePath string logReg = `TCP_HIT/([0-9][0-9][0-9]) [0-9]+ [A-Z]+ http://c13.adrise.tv/04C0BF/v2/sources/content-owners/[0-9a-z]+/([0-9]+)/` logMap = make(map[string]int) ) func init() { filePath =os.Args[1] } func processLog(contents string) { re := regexp.MustCompile(logReg) matches := re.FindAllStringSubmatch(contents, -1) for _, m := range matches { key := m[1]+ "_" +m[2] count, ok := logMap [ key ] if (ok) { logMap [ key ] = count + 1 } else { logMap [ key ] = 1 } } } func readLine(fileName string, handler func(string)) error { f, err := os.Open(fileName) if err != nil { return err } buf := bufio.NewReader(f) for { line, err := buf.ReadString('\n')
//TrimSpace 将删除 s 首尾连续的的空白字符 line = strings.TrimSpace(line) handler(line) if err != nil { if err == io.EOF { return nil } return err } } return nil } func main() { //filePath = "/data/access.log" if err := readLine(filePath, processLog); err != nil { panic(err) } for log:= range logMap { fmt.Println(log, "appear count: ", logMap [log]) } }