feat: api stdout logger
This commit is contained in:
parent
8f4132f131
commit
7057e232e6
29
ctx.go
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
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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user