calltrace

master
Charles Iliya Krempeaux 2019-07-11 21:27:37 -07:00
parent ac46db3f16
commit c0015e89c0
3 changed files with 75 additions and 0 deletions

62
calltrace.go 100644
View File

@ -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
}

View File

@ -63,6 +63,10 @@ func (router *DefaultWritingRouter) Route(message string, context map[string]int
p = dotquote.AppendString(p, message, "text")
p = append(p, ' ')
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 errorFieldValue, ok := context["~error"]; ok {

View File

@ -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_DEFAULT = "\033[95m" // HEADER
const STYLE_RESET = "\033[0m" // RESET
const STYLE_CALLTRACE = "\033[40;36;1m" // BG BLACK, FG CYAN, BOLD
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)
}
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)
//@TODO: Should this be checking for errors from fmt.Fprintln()?