57 lines
1.5 KiB
Go
57 lines
1.5 KiB
Go
package logfrog
|
|
|
|
import (
|
|
"runtime"
|
|
"time"
|
|
|
|
"github.com/qdm12/reprint"
|
|
)
|
|
|
|
type LogCaller struct {
|
|
File string `json:"file"`
|
|
Line int `json:"line"`
|
|
Funcname string `json:"funcname,omitempty"`
|
|
}
|
|
|
|
func captureCaller(skip int) *LogCaller {
|
|
pc, filename, line, ok := runtime.Caller(skip + 1)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
c := &LogCaller { filename, line, "?()" }
|
|
fn := runtime.FuncForPC(pc)
|
|
if fn != nil {
|
|
c.Funcname = fn.Name() + "()"
|
|
}
|
|
|
|
return c
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------
|
|
|
|
type Fields map[string]interface{}
|
|
|
|
// --------------------------------------------------------------------------------
|
|
|
|
type LogRecord struct {
|
|
Source string `json:"source,omitempty"`
|
|
Created time.Time `json:"created_at"`
|
|
Level LogLevel `json:"lvl"`
|
|
Message string `json:"msg"`
|
|
Caller *LogCaller `json:"caller,omitempty"`
|
|
Fields Fields `json:"fields"`
|
|
}
|
|
|
|
func (r *LogRecord) Clone() *LogRecord {
|
|
c := reprint.This(r)
|
|
return c.(*LogRecord)
|
|
}
|
|
|
|
func NewLogRecord(skip int, created time.Time, level LogLevel, message string, fields Fields) *LogRecord {
|
|
return &LogRecord{ "", created, level, message, captureCaller(skip + 1), fields }
|
|
}
|
|
|
|
func newLogRecordFromSource(source *Logger, skip int, created time.Time, level LogLevel, message string, fields Fields) *LogRecord {
|
|
return &LogRecord{ source.GetName(), created, level, message, captureCaller(skip + 1), fields }
|
|
} |