寫在前面
最近在修改調(diào)試系統(tǒng)中的日志展示,日志展示用的是websocket轰胁,用curl不好測試朝扼,所以動手寫了一個客戶端來查看系統(tǒng)日志。
websocket client
代碼如下(代碼中有bug擎颖,不要復(fù)制粘貼)
package main
import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
"golang.org/x/net/websocket"
)
func main() {
url := os.Args[1]
origin := os.Args[2]
fmt.Printf("Dial url: %s ,origin: %s\n", url, origin)
ws, err := websocket.Dial(url, "", origin)
if err != nil {
log.Fatal(err)
}
var msg = make([]byte, 512)
go func() {
for {
ws.Read(msg)
m, err := ws.Read(msg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s\n", msg[:m])
}
}()
errs := make(chan error, 2)
go func() {
c := make(chan os.Signal)
signal.Notify(c, syscall.SIGINT)
errs <- fmt.Errorf("%s", <-c)
}()
fmt.Printf("terminated: %v", <-errs)
ws.Close() //關(guān)閉連接
}
然后編譯執(zhí)行搂捧,發(fā)現(xiàn)只打印了偶數(shù)行?
./wscat ws://127.0.0.1:8888/watch/clusterlog?clusterid=cb63a0bc-8273-45ef-a966-67b46968e518 http://127.0.0.1:8888
Dial url: ws://127.0.0.1:8888/watch/clusterlog?clusterid=cb63a0bc-8273-45ef-a966-67b46968e518 ,origin: http://127.0.0.1:8888
Receive: b
Receive: d
Receive: f
Receive: h
沒多想王凑,由于server端代碼不太熟吮蛹,先入為主的以為是server端的問題(因為client端代碼太少了,太盲目自大了)潮针,所以拆分核心處理模塊,把server精簡成一個小程序來測試瓣戚,這里貼上server端代碼:
package main
import (
"fmt"
"net/http"
"strings"
"time"
"github.com/hpcloud/tail"
"golang.org/x/net/websocket"
)
func echoHandler(ws *websocket.Conn) {
cid := ws.Request().URL.Query().Get("clusterid")
// get agent ansible output log.
filename := "/var/log/" + cid + ".idx"
t, err := tail.TailFile(filename, tail.Config{
ReOpen: true,
Follow: true,
// Location: &tail.SeekInfo{Offset: 0, Whence: 2},
MustExist: false,
Poll: true,
})
if err != nil {
fmt.Println("tail file err:", err)
return
}
var line *tail.Line
var ok bool
lastwoline := false
for {
line, ok = <-t.Lines
if !ok {
time.Sleep(100 * time.Millisecond)
continue
}
_, err := ws.Write([]byte(line.Text))
if err != nil {
fmt.Printf("Error: %s", err)
return
}
if lastwoline {
break
}
if strings.Contains(line.Text, "PLAY RECAP") {
lastwoline = true
}
}
}
func main() {
http.Handle("/watch/clusterlog", websocket.Handler(echoHandler))
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}
還是沒什么卵用子库,還是只打印log的奇數(shù)行矗晃,看代碼不仔細,下面祭出golang的單步代碼調(diào)試神器:delve张症,詳情見下節(jié)golang單步調(diào)試神器delve。
錯誤原因是wscat的32行脖捻,ws.Read讀了兩遍
以上↑