解析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])
}
}