github.com/0chain/gosdk@v1.17.11/zcnbridge/log/handler.go (about) 1 package log 2 3 import ( 4 "net/http" 5 "os" 6 "strings" 7 8 "github.com/0chain/gosdk/core/sys" 9 ) 10 11 // HandleFunc returns handle function that writes logs to http.ResponseWriter with provided buffer size. 12 // Buffered length represented in kilobytes. 13 func HandleFunc(buffLen int64) func(http.ResponseWriter, *http.Request) { 14 return func(w http.ResponseWriter, _ *http.Request) { 15 file, err := os.Open(logName) 16 if err != nil { 17 w.WriteHeader(http.StatusInternalServerError) 18 return 19 } 20 defer func() { 21 _ = file.Close() 22 }() 23 24 stat, err := sys.Files.Stat(logName) 25 if err != nil { 26 w.WriteHeader(http.StatusInternalServerError) 27 return 28 } 29 30 var ( 31 writeLen = buffLen * 1024 32 brokenLines = true // flag that describes existence of broken lines 33 ) 34 if writeLen > stat.Size() { 35 writeLen = stat.Size() 36 brokenLines = false 37 } 38 39 buf := make([]byte, writeLen) 40 _, err = file.ReadAt(buf, stat.Size()-writeLen) 41 if err != nil { 42 w.WriteHeader(http.StatusInternalServerError) 43 return 44 } 45 46 // cut broken lines if it exists 47 if brokenLines { 48 lbInd := strings.Index(string(buf), "\n") 49 buf = buf[lbInd+1:] 50 } 51 52 if _, err := w.Write(buf); err != nil { 53 w.WriteHeader(http.StatusInternalServerError) 54 return 55 } 56 } 57 }