feat: api stdout logger

This commit is contained in:
loveuer 2024-01-14 19:10:05 +08:00
parent 8f4132f131
commit 7057e232e6
4 changed files with 79 additions and 12 deletions

29
ctx.go

@ -14,7 +14,7 @@ import (
type Ctx struct {
// origin objects
Writer http.ResponseWriter
writer http.ResponseWriter
Request *http.Request
// request info
path string
@ -31,10 +31,11 @@ type Ctx struct {
func newContext(app *App, writer http.ResponseWriter, request *http.Request) *Ctx {
return &Ctx{
Writer: writer,
Request: request,
path: request.URL.Path,
Method: request.Method,
writer: writer,
Request: request,
path: request.URL.Path,
Method: request.Method,
StatusCode: 200,
app: app,
index: -1,
@ -182,16 +183,16 @@ func (c *Ctx) QueryParser(out interface{}) error {
func (c *Ctx) Status(code int) *Ctx {
c.StatusCode = code
c.Writer.WriteHeader(code)
c.writer.WriteHeader(code)
return c
}
func (c *Ctx) Set(key string, value string) {
c.Writer.Header().Set(key, value)
c.writer.Header().Set(key, value)
}
func (c *Ctx) SetHeader(key string, value string) {
c.Writer.Header().Set(key, value)
c.writer.Header().Set(key, value)
}
func (c *Ctx) SendString(data string) error {
@ -202,13 +203,13 @@ func (c *Ctx) SendString(data string) error {
func (c *Ctx) Writef(format string, values ...interface{}) (int, error) {
c.SetHeader("Content-Type", "text/plain")
return c.Writer.Write([]byte(fmt.Sprintf(format, values...)))
return c.writer.Write([]byte(fmt.Sprintf(format, values...)))
}
func (c *Ctx) JSON(data interface{}) error {
c.SetHeader("Content-Type", "application/json")
encoder := json.NewEncoder(c.Writer)
encoder := json.NewEncoder(c.writer)
if err := encoder.Encode(data); err != nil {
return err
@ -217,12 +218,16 @@ func (c *Ctx) JSON(data interface{}) error {
return nil
}
func (c *Ctx) RawWriter() http.ResponseWriter {
return c.writer
}
func (c *Ctx) Write(data []byte) (int, error) {
return c.Writer.Write(data)
return c.writer.Write(data)
}
func (c *Ctx) HTML(html string) error {
c.SetHeader("Content-Type", "text/html")
_, err := c.Writer.Write([]byte(html))
_, err := c.writer.Write([]byte(html))
return err
}

@ -2,8 +2,10 @@ package nf
import (
"fmt"
"log"
"os"
"runtime/debug"
"time"
)
func NewRecover(enableStackTrace bool) HandlerFunc {
@ -21,3 +23,53 @@ func NewRecover(enableStackTrace bool) HandlerFunc {
return c.Next()
}
}
func NewLogger() HandlerFunc {
l := log.New(os.Stdout, "[NF] ", 0)
durationFormat := func(num int64) string {
var (
unit = "ns"
)
if num > 1000 {
num = num / 1000
unit = "µs"
}
if num > 1000 {
num = num / 1000
unit = "ms"
}
if num > 1000 {
num = num / 1000
unit = " s"
}
return fmt.Sprintf("%v %s", num, unit)
}
return func(c *Ctx) error {
start := time.Now()
err := c.Next()
var (
duration = time.Now().Sub(start).Nanoseconds()
status = c.StatusCode
path = c.path
method = c.Request.Method
)
l.Printf("%s | %5s | %d | %s | %s",
start.Format("06/01/02T15:04:05"),
method,
status,
durationFormat(duration),
path,
)
return err
}
}

4
nf.go

@ -42,6 +42,10 @@ func New(config ...Config) *App {
app.RouterGroup = &RouterGroup{app: app}
app.groups = []*RouterGroup{app.RouterGroup}
if !app.config.DisableLogger {
app.Use(NewLogger())
}
if !app.config.DisableRecover {
app.Use(NewRecover(true))
}

@ -4,6 +4,7 @@ import (
"github.com/loveuer/nf"
"log"
"net"
"time"
)
func main() {
@ -13,6 +14,11 @@ func main() {
name := c.Param("name")
return c.JSON(nf.Map{"status": 200, "data": "hello, " + name})
})
app.Patch("/world", func(c *nf.Ctx) error {
time.Sleep(5 * time.Second)
c.Status(404)
return c.JSON(nf.Map{"method": c.Method, "status": c.StatusCode})
})
ln, _ := net.Listen("tcp", ":80")
log.Fatal(app.RunListener(ln))