(refactor): prepare breaking v2 API
- rename package to sneklog and move module to /v2 - replace text output flags with writer formatters - remove external color dependencies - update migration notes and coverage
This commit is contained in:
@@ -1,13 +1,10 @@
|
||||
package slog
|
||||
package sneklog
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/fatih/color"
|
||||
)
|
||||
|
||||
type replacer struct {
|
||||
@@ -26,21 +23,28 @@ type Logger struct {
|
||||
writers []LoggerWriter
|
||||
replacers []replacer
|
||||
|
||||
printTraceback bool
|
||||
printTime bool
|
||||
jsonPretty bool
|
||||
jsonPretty bool
|
||||
}
|
||||
|
||||
// LogLevel describes a logging severity.
|
||||
type LogLevel struct {
|
||||
n uint8
|
||||
t string
|
||||
c color.Attribute
|
||||
n uint8
|
||||
t string
|
||||
fg FgColor
|
||||
bg BgColor
|
||||
}
|
||||
|
||||
// GetName returns the lowercase textual representation of the level.
|
||||
func (l *LogLevel) GetName() string {
|
||||
return l.t
|
||||
func (l *LogLevel) GetName() string { return l.t }
|
||||
func (l *LogLevel) GetFgColor() FgColor { return l.fg }
|
||||
func (l *LogLevel) SetFgColor(color FgColor) *LogLevel {
|
||||
l.fg = color
|
||||
return l
|
||||
}
|
||||
func (l *LogLevel) GetBgColor() BgColor { return l.bg }
|
||||
func (l *LogLevel) SetBgColor(color BgColor) *LogLevel {
|
||||
l.bg = color
|
||||
return l
|
||||
}
|
||||
|
||||
// MethodTraceback describes a single stack frame attached to a log entry.
|
||||
@@ -54,20 +58,18 @@ type MethodTraceback struct {
|
||||
|
||||
// Predefined log levels.
|
||||
var (
|
||||
INFO = LogLevel{n: 0, t: "info", c: color.FgWhite}
|
||||
WARN = LogLevel{n: 1, t: "warn", c: color.FgHiYellow}
|
||||
ERROR = LogLevel{n: 2, t: "error", c: color.FgHiRed}
|
||||
FATAL = LogLevel{n: 3, t: "fatal", c: color.FgRed}
|
||||
DEBUG = LogLevel{n: 4, t: "debug", c: color.FgGreen}
|
||||
INFO = LogLevel{n: 0, t: "info", fg: FgWhite}
|
||||
WARN = LogLevel{n: 1, t: "warn", fg: FgHiYellow}
|
||||
ERROR = LogLevel{n: 2, t: "error", fg: FgHiRed}
|
||||
FATAL = LogLevel{n: 3, t: "fatal", fg: FgRed}
|
||||
DEBUG = LogLevel{n: 4, t: "debug", fg: FgGreen}
|
||||
)
|
||||
|
||||
// CreateLogger creates a logger with default settings.
|
||||
func CreateLogger() *Logger {
|
||||
return &Logger{
|
||||
prefix: "LOG",
|
||||
level: FATAL,
|
||||
printTraceback: false,
|
||||
printTime: true,
|
||||
prefix: "LOG",
|
||||
level: FATAL,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,18 +85,6 @@ func (l *Logger) Level(level LogLevel) *Logger {
|
||||
return l
|
||||
}
|
||||
|
||||
// PrintTraceback enables traceback output for text writers.
|
||||
func (l *Logger) PrintTraceback(b bool) *Logger {
|
||||
l.printTraceback = b
|
||||
return l
|
||||
}
|
||||
|
||||
// PrintTime enables timestamps for text writers.
|
||||
func (l *Logger) PrintTime(b bool) *Logger {
|
||||
l.printTime = b
|
||||
return l
|
||||
}
|
||||
|
||||
// JsonPretty enables indented JSON output for JSON writers.
|
||||
func (l *Logger) JsonPretty(b bool) *Logger {
|
||||
l.jsonPretty = b
|
||||
@@ -145,17 +135,17 @@ func (l *Logger) Close() error {
|
||||
|
||||
// CreateTextWriter wraps an external writer with the logger text settings.
|
||||
func (l *Logger) CreateTextWriter(w io.Writer) *LoggerTextWriter {
|
||||
return CreateTextWriter(w, l.printTraceback, l.printTime)
|
||||
return CreateTextWriter(w)
|
||||
}
|
||||
|
||||
// CreateTextStdoutWriter creates a non-owning text writer for os.Stdout.
|
||||
func (l *Logger) CreateTextStdoutWriter() *LoggerTextWriter {
|
||||
return CreateTextStdoutWriter(l.printTraceback, l.printTime)
|
||||
return CreateTextStdoutWriter()
|
||||
}
|
||||
|
||||
// CreateTextFileWriter creates an owning text writer for a file.
|
||||
func (l *Logger) CreateTextFileWriter(filename string) (*LoggerTextWriter, error) {
|
||||
return CreateTextFileWriter(filename, l.printTraceback, l.printTime)
|
||||
return CreateTextFileWriter(filename)
|
||||
}
|
||||
|
||||
// CreateJsonWriter wraps an external writer with the logger JSON settings.
|
||||
@@ -191,44 +181,3 @@ func (l *Logger) replaceAll(messages ...any) []any {
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// FormatTime converts time to the package text log timestamp format.
|
||||
func FormatTime(t time.Time) string {
|
||||
return fmt.Sprintf("%02d.%02d.%02d %02d:%02d:%02d", t.Day(), t.Month(), t.Year(), t.Hour(), t.Minute(), t.Second())
|
||||
}
|
||||
|
||||
// FormatTraceback converts a traceback frame to a compact string.
|
||||
func FormatTraceback(mt *MethodTraceback) string {
|
||||
return fmt.Sprintf("%s:%s:%d", mt.Filename, mt.Method, mt.Line)
|
||||
}
|
||||
|
||||
// FormatFullTraceback joins multiple traceback frames into one string.
|
||||
func FormatFullTraceback(tracebacks []*MethodTraceback) string {
|
||||
formatted := make([]string, 0)
|
||||
for _, tb := range tracebacks {
|
||||
formatted = append(formatted, FormatTraceback(tb))
|
||||
}
|
||||
return strings.Join(formatted, "->")
|
||||
}
|
||||
|
||||
// BuildString renders a text log record using the provided settings.
|
||||
func BuildString(level LogLevel, prefix string, printTime, printTraceback bool, messages ...any) string {
|
||||
args := []string{
|
||||
fmt.Sprintf("[%s]", prefix),
|
||||
fmt.Sprintf("[%s]", strings.ToUpper(level.t)),
|
||||
}
|
||||
|
||||
if printTraceback {
|
||||
args = append(args, fmt.Sprintf("[%s]", FormatTraceback(getTraceback())))
|
||||
}
|
||||
|
||||
if printTime {
|
||||
args = append(args, fmt.Sprintf("[%s]", FormatTime(time.Now())))
|
||||
}
|
||||
|
||||
m := Map(messages, func(t any) string {
|
||||
return fmt.Sprint(t)
|
||||
})
|
||||
s := fmt.Sprintf("%s %s", strings.Join(args, " "), strings.Join(m, " "))
|
||||
return s
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user