calltrace
parent
ac46db3f16
commit
c0015e89c0
|
@ -0,0 +1,62 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func calltrace() []string {
|
||||||
|
|
||||||
|
const max = 10
|
||||||
|
|
||||||
|
var frames *runtime.Frames
|
||||||
|
{
|
||||||
|
var buffer [max]uintptr
|
||||||
|
|
||||||
|
var pc []uintptr = buffer[:]
|
||||||
|
|
||||||
|
n := runtime.Callers(0, pc)
|
||||||
|
if 0 >= n {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
pc = pc[:n]
|
||||||
|
frames = runtime.CallersFrames(pc)
|
||||||
|
}
|
||||||
|
|
||||||
|
var trace []string
|
||||||
|
{
|
||||||
|
var buffer [max]string
|
||||||
|
trace = buffer[:0]
|
||||||
|
|
||||||
|
var more bool = true
|
||||||
|
for more {
|
||||||
|
var frame runtime.Frame
|
||||||
|
|
||||||
|
frame, more = frames.Next()
|
||||||
|
switch frame.Function {
|
||||||
|
case "runtime.Callers":
|
||||||
|
continue
|
||||||
|
default:
|
||||||
|
if strings.HasPrefix(frame.Function, "github.com/reiver/go-flog.") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var filename string = frame.File
|
||||||
|
if index := strings.LastIndex(filename, "/"); 0 <= index {
|
||||||
|
filename = filename[1+index:]
|
||||||
|
}
|
||||||
|
|
||||||
|
s := fmt.Sprintf("%s():%s:%d", frame.Function, filename, frame.Line)
|
||||||
|
|
||||||
|
trace = append(trace, s)
|
||||||
|
|
||||||
|
if !more {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return trace
|
||||||
|
}
|
|
@ -63,6 +63,10 @@ func (router *DefaultWritingRouter) Route(message string, context map[string]int
|
||||||
p = dotquote.AppendString(p, message, "text")
|
p = dotquote.AppendString(p, message, "text")
|
||||||
p = append(p, ' ')
|
p = append(p, ' ')
|
||||||
p = dotquote.AppendString(p, time.Now().String(), "when")
|
p = dotquote.AppendString(p, time.Now().String(), "when")
|
||||||
|
if trace := calltrace(); nil != trace {
|
||||||
|
p = append(p, ' ')
|
||||||
|
p = dotquote.AppendStrings(p, trace, "calltrace")
|
||||||
|
}
|
||||||
|
|
||||||
// If we have an error, then get the error.Error() into the log too.
|
// If we have an error, then get the error.Error() into the log too.
|
||||||
if errorFieldValue, ok := context["~error"]; ok {
|
if errorFieldValue, ok := context["~error"]; ok {
|
||||||
|
|
|
@ -41,6 +41,7 @@ func (router *PrettyWritingRouter) Route(message string, context map[string]inte
|
||||||
const STYLE_MESSAGE = "\x1b[44;37;1m" // BG BLUE, FG WHITE, BOLD
|
const STYLE_MESSAGE = "\x1b[44;37;1m" // BG BLUE, FG WHITE, BOLD
|
||||||
const STYLE_DEFAULT = "\033[95m" // HEADER
|
const STYLE_DEFAULT = "\033[95m" // HEADER
|
||||||
const STYLE_RESET = "\033[0m" // RESET
|
const STYLE_RESET = "\033[0m" // RESET
|
||||||
|
const STYLE_CALLTRACE = "\033[40;36;1m" // BG BLACK, FG CYAN, BOLD
|
||||||
|
|
||||||
str := ""
|
str := ""
|
||||||
|
|
||||||
|
@ -101,6 +102,14 @@ func (router *PrettyWritingRouter) Route(message string, context map[string]inte
|
||||||
str = fmt.Sprintf("%s\t%s%s%s=%s%#v%s", str, style, key, STYLE_RESET, style, value, STYLE_RESET)
|
str = fmt.Sprintf("%s\t%s%s%s=%s%#v%s", str, style, key, STYLE_RESET, style, value, STYLE_RESET)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if trace := calltrace(); nil != trace {
|
||||||
|
str = fmt.Sprintf("%s\t⟨⟨", str)
|
||||||
|
for _, s := range trace {
|
||||||
|
str = fmt.Sprintf("%s %s%s%s,", str, STYLE_CALLTRACE, s, STYLE_RESET)
|
||||||
|
}
|
||||||
|
str = fmt.Sprintf("%s ⟩⟩", str)
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Fprintln(router.writer, str)
|
fmt.Fprintln(router.writer, str)
|
||||||
|
|
||||||
//@TODO: Should this be checking for errors from fmt.Fprintln()?
|
//@TODO: Should this be checking for errors from fmt.Fprintln()?
|
||||||
|
|
Loading…
Reference in New Issue