(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:
2026-04-24 15:43:14 +03:00
parent 14b787710c
commit d534f92d48
18 changed files with 845 additions and 171 deletions
+26 -77
View File
@@ -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
}