mirror of
https://github.com/kataras/iris.git
synced 2025-01-23 18:51:03 +01:00
more route logging improvements, see the parent commit
Former-commit-id: 973167e3ca7b3463f79ec62ab8be6770727f1c2b
This commit is contained in:
parent
77a79cae58
commit
66e641513c
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
app := iris.New()
|
app := iris.New()
|
||||||
|
app.Logger().SetLevel("debug").SetTimeFormat("")
|
||||||
|
|
||||||
// GET: http://localhost:8080
|
// GET: http://localhost:8080
|
||||||
app.Get("/", info)
|
app.Get("/", info)
|
||||||
|
@ -31,17 +32,15 @@ func main() {
|
||||||
|
|
||||||
// Static assets
|
// Static assets
|
||||||
|
|
||||||
// GET: http://localhost:8080/assets/css/bootstrap.min.css
|
// GET: http://localhost:8080/assets/css/main.css
|
||||||
// maps to ./public/assets/css/bootstrap.min.css file at system location.
|
// maps to ./public/assets/css/main.css file at system location.
|
||||||
// GET: http://localhost:8080/assets/js/react.min.js
|
|
||||||
// maps to ./public/assets/js/react.min.js file at system location.
|
|
||||||
app.HandleDir("/assets", "./public/assets")
|
app.HandleDir("/assets", "./public/assets")
|
||||||
|
|
||||||
/* OR
|
/* OR
|
||||||
|
|
||||||
// GET: http://localhost:8080/js/react.min.js
|
// GET: http://localhost:8080/css/main.css
|
||||||
// maps to ./public/assets/js/react.min.js file at system location.
|
// maps to ./public/assets/css/main.css file at system location.
|
||||||
app.HandleDir("/js", "./public/assets/js")
|
app.HandleDir("/css", "./public/assets/css")
|
||||||
|
|
||||||
// GET: http://localhost:8080/css/bootstrap.min.css
|
// GET: http://localhost:8080/css/bootstrap.min.css
|
||||||
// maps to ./public/assets/css/bootstrap.min.css file at system location.
|
// maps to ./public/assets/css/bootstrap.min.css file at system location.
|
||||||
|
@ -90,7 +89,7 @@ func main() {
|
||||||
usersRoutes.Delete("/{id:uint64}", func(ctx iris.Context) {
|
usersRoutes.Delete("/{id:uint64}", func(ctx iris.Context) {
|
||||||
id, _ := ctx.Params().GetUint64("id")
|
id, _ := ctx.Params().GetUint64("id")
|
||||||
ctx.Writef("delete user by id: %d", id)
|
ctx.Writef("delete user by id: %d", id)
|
||||||
})
|
}).SetDescription("Deletes a User")
|
||||||
|
|
||||||
// Subdomains, depends on the host, you have to edit the hosts or nginx/caddy's configuration if you use them.
|
// Subdomains, depends on the host, you have to edit the hosts or nginx/caddy's configuration if you use them.
|
||||||
//
|
//
|
||||||
|
|
3
_examples/routing/overview/public/assets/css/main.css
Normal file
3
_examples/routing/overview/public/assets/css/main.css
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
body {
|
||||||
|
background-color: black;
|
||||||
|
}
|
|
@ -349,11 +349,14 @@ func (api *APIBuilder) HandleDir(requestPath, directory string, opts ...DirOptio
|
||||||
options := getDirOptions(opts...)
|
options := getDirOptions(opts...)
|
||||||
|
|
||||||
h := FileServer(directory, options)
|
h := FileServer(directory, options)
|
||||||
|
description := directory
|
||||||
|
fileName, lineNumber := context.HandlerFileLine(h) // take those before StripPrefix.
|
||||||
|
|
||||||
// if subdomain, we get the full path of the path only,
|
// if subdomain, we get the full path of the path only,
|
||||||
// because a subdomain can have parties as well
|
// because a subdomain can have parties as well
|
||||||
// and we need that path to call the `StripPrefix`.
|
// and we need that path to call the `StripPrefix`.
|
||||||
if _, fullpath := splitSubdomainAndPath(joinPath(api.relativePath, requestPath)); fullpath != "/" {
|
_, fullpath := splitSubdomainAndPath(joinPath(api.relativePath, requestPath))
|
||||||
|
if fullpath != "/" {
|
||||||
h = StripPrefix(fullpath, h)
|
h = StripPrefix(fullpath, h)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -394,7 +397,12 @@ func (api *APIBuilder) HandleDir(requestPath, directory string, opts ...DirOptio
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, route := range routes {
|
for _, route := range routes {
|
||||||
route.MainHandlerName = `HandleDir(directory: "` + directory + `")`
|
if route.Method == http.MethodHead {
|
||||||
|
} else {
|
||||||
|
route.SetDescription(description)
|
||||||
|
route.SetSourceLine(fileName, lineNumber)
|
||||||
|
}
|
||||||
|
|
||||||
if _, err := api.routes.register(route, api.routeRegisterRule); err != nil {
|
if _, err := api.routes.register(route, api.routeRegisterRule); err != nil {
|
||||||
api.errors.Add(err)
|
api.errors.Add(err)
|
||||||
break
|
break
|
||||||
|
@ -884,8 +892,8 @@ func (api *APIBuilder) StaticContent(reqPath string, cType string, content []byt
|
||||||
//
|
//
|
||||||
// Returns the GET *Route.
|
// Returns the GET *Route.
|
||||||
func (api *APIBuilder) Favicon(favPath string, requestPath ...string) *Route {
|
func (api *APIBuilder) Favicon(favPath string, requestPath ...string) *Route {
|
||||||
|
description := favPath
|
||||||
favPath = Abs(favPath)
|
favPath = Abs(favPath)
|
||||||
|
|
||||||
f, err := os.Open(favPath)
|
f, err := os.Open(favPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
api.errors.Addf("favicon: file or directory %s not found: %w", favPath, err)
|
api.errors.Addf("favicon: file or directory %s not found: %w", favPath, err)
|
||||||
|
@ -924,7 +932,7 @@ func (api *APIBuilder) Favicon(favPath string, requestPath ...string) *Route {
|
||||||
reqPath = requestPath[0]
|
reqPath = requestPath[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
return api.registerResourceRoute(reqPath, h)
|
return api.registerResourceRoute(reqPath, h).SetDescription(description)
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnErrorCode registers an error http status code
|
// OnErrorCode registers an error http status code
|
||||||
|
|
|
@ -145,6 +145,23 @@ func (r *Route) SetStatusOffline() bool {
|
||||||
return r.ChangeMethod(MethodNone)
|
return r.ChangeMethod(MethodNone)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetDescription sets the route's description
|
||||||
|
// that will be logged alongside with the route information
|
||||||
|
// in DEBUG log level.
|
||||||
|
// Returns the `Route` itself.
|
||||||
|
func (r *Route) SetDescription(description string) *Route {
|
||||||
|
r.Description = description
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetSourceLine sets the route's source caller, useful for debugging.
|
||||||
|
// Returns the `Route` itself.
|
||||||
|
func (r *Route) SetSourceLine(fileName string, lineNumber int) *Route {
|
||||||
|
r.SourceFileName = fileName
|
||||||
|
r.SourceLineNumber = lineNumber
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
// RestoreStatus will try to restore the status of this route instance, i.e if `SetStatusOffline` called on a "GET" route,
|
// RestoreStatus will try to restore the status of this route instance, i.e if `SetStatusOffline` called on a "GET" route,
|
||||||
// then this function will make this route available with "GET" HTTP Method.
|
// then this function will make this route available with "GET" HTTP Method.
|
||||||
// Note if that you want to set status online for an offline registered route then you should call the `ChangeMethod` instead.
|
// Note if that you want to set status online for an offline registered route then you should call the `ChangeMethod` instead.
|
||||||
|
@ -324,6 +341,44 @@ func (r *Route) ResolvePath(args ...string) string {
|
||||||
return formattedPath
|
return formattedPath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ignoreHandlersTraces = [...]string{
|
||||||
|
"iris/macro/handler.MakeHandler.func1",
|
||||||
|
"iris/core/router.(*APIBuilder).Favicon.func1",
|
||||||
|
"iris/core/router.StripPrefix.func1",
|
||||||
|
}
|
||||||
|
|
||||||
|
func ignoreHandlerTrace(name string) bool {
|
||||||
|
for _, ignore := range ignoreHandlersTraces {
|
||||||
|
if name == ignore {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func traceHandlerFile(name, line string, number int, seen map[string]struct{}) string {
|
||||||
|
file := fmt.Sprintf("(%s:%d)", line, number)
|
||||||
|
|
||||||
|
if _, printed := seen[file]; printed {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
seen[file] = struct{}{}
|
||||||
|
|
||||||
|
// trim the path for Iris' internal middlewares, e.g.
|
||||||
|
// irs/mvc.GRPC.Apply.func1
|
||||||
|
if internalName := "github.com/kataras/iris/v12"; strings.HasPrefix(name, internalName) {
|
||||||
|
name = strings.Replace(name, internalName, "iris", 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ignoreHandlerTrace(name) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("\n ⬝ %s %s", name, file)
|
||||||
|
}
|
||||||
|
|
||||||
// Trace returns some debug infos as a string sentence.
|
// Trace returns some debug infos as a string sentence.
|
||||||
// Should be called after `Build` state.
|
// Should be called after `Build` state.
|
||||||
//
|
//
|
||||||
|
@ -371,10 +426,12 @@ func (r *Route) Trace() string {
|
||||||
// (@route_rel_location)
|
// (@route_rel_location)
|
||||||
s += fmt.Sprintf(" (%s:%d)", r.RegisterFileName, r.RegisterLineNumber)
|
s += fmt.Sprintf(" (%s:%d)", r.RegisterFileName, r.RegisterLineNumber)
|
||||||
|
|
||||||
|
seen := make(map[string]struct{})
|
||||||
|
|
||||||
// if the main handler is not an anonymous function (so, differs from @route_rel_location)
|
// if the main handler is not an anonymous function (so, differs from @route_rel_location)
|
||||||
// then * @handler_name (@handler_rel_location)
|
// then * @handler_name (@handler_rel_location)
|
||||||
if r.SourceFileName != r.RegisterFileName || r.SourceLineNumber != r.RegisterLineNumber {
|
if r.SourceFileName != r.RegisterFileName || r.SourceLineNumber != r.RegisterLineNumber {
|
||||||
s += fmt.Sprintf("\n ⬝ %s (%s:%d)", r.MainHandlerName, r.SourceFileName, r.SourceLineNumber)
|
s += traceHandlerFile(r.MainHandlerName, r.SourceFileName, r.SourceLineNumber, seen)
|
||||||
}
|
}
|
||||||
|
|
||||||
wd, _ := os.Getwd()
|
wd, _ := os.Getwd()
|
||||||
|
@ -385,19 +442,13 @@ func (r *Route) Trace() string {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// trim the path for Iris' internal middlewares, e.g.
|
|
||||||
// irs/mvc.GRPC.Apply.func1
|
|
||||||
if internalName := "github.com/kataras/iris/v12"; strings.HasPrefix(name, internalName) {
|
|
||||||
name = strings.Replace(name, internalName, "iris", 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
file, line := context.HandlerFileLineRel(h, wd)
|
file, line := context.HandlerFileLineRel(h, wd)
|
||||||
if file == r.RegisterFileName && line == r.RegisterLineNumber {
|
if file == r.RegisterFileName && line == r.RegisterLineNumber {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// * @handler_name (@handler_rel_location)
|
// * @handler_name (@handler_rel_location)
|
||||||
s += fmt.Sprintf("\n ⬝ %s (%s:%d)", name, file, line)
|
s += traceHandlerFile(name, file, line, seen)
|
||||||
}
|
}
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
Loading…
Reference in New Issue
Block a user