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  }