package main

import (
	"encoding/json"

	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/middleware/requestid"

	"github.com/kataras/golog"
)

func main() {
	app := iris.New()
	app.Logger().SetLevel("debug")
	app.Logger().Handle(jsonOutput)

	app.Use(requestid.New())

	/* Example Output:
	{
	    "timestamp": 1591422944,
	    "level": "debug",
	    "message": "This is a message with data",
	    "fields": {
	        "username": "kataras"
	    },
	    "stacktrace": [
	        {
	            "function": "main.main",
	            "source": "C:/mygopath/src/github.com/kataras/iris/_examples/logging/json-logger/main.go:16"
	        }
	    ]
	}
	*/
	app.Logger().Debugf("This is a %s with data (debug prints the stacktrace too)", "message", golog.Fields{
		"username": "kataras",
	})

	/* Example Output:
	{
	    "timestamp": 1591422944,
	    "level": "info",
	    "message": "An info message",
	    "fields": {
	        "home": "https://iris-go.com"
	    }
	}
	*/
	app.Logger().Infof("An info message", golog.Fields{"home": "https://iris-go.com"})

	app.Get("/ping", ping)

	// Navigate to http://localhost:8080/ping.
	app.Listen(":8080" /*, iris.WithoutBanner*/)
}

func jsonOutput(l *golog.Log) bool {
	enc := json.NewEncoder(l.Logger.Printer) // you can change the output to a file as well.
	enc.SetIndent("", "    ")
	err := enc.Encode(l)
	return err == nil
}

func ping(ctx iris.Context) {
	/* Example Output:
	{
	    "timestamp": 1591423046,
	    "level": "debug",
	    "message": "Request path: /ping",
	    "fields": {
	        "request_id": "fc12d88a-a338-4bb9-aa5e-126f2104365c"
	    },
	    "stacktrace": [
	        {
	            "function": "main.ping",
	            "source": "C:/mygopath/src/github.com/kataras/iris/_examples/logging/json-logger/main.go:82"
	        },
	       ...
	    ]
	}
	*/
	ctx.Application().Logger().Debugf("Request path: %s", ctx.Path(), golog.Fields{
		"request_id": ctx.GetID(),
	})

	ctx.WriteString("pong")
}