diff --git a/go.mod b/go.mod index 53a52f3..6d230a9 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,10 @@ module go.arcalot.io/log/v2 go 1.21 + +require ( + go.arcalot.io/assert v1.8.0 + golang.org/x/term v0.21.0 +) + +require golang.org/x/sys v0.21.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..ba20ab0 --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +go.arcalot.io/assert v1.8.0 h1:hGcHMPncQXwQvjj7MbyOu2gg8VIBB00crUJZpeQOjxs= +go.arcalot.io/assert v1.8.0/go.mod h1:nNmWPoNUHFyrPkNrD2aASm5yPuAfiWdB/4X7Lw3ykHk= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= diff --git a/message.go b/message.go index 7794135..27183a9 100644 --- a/message.go +++ b/message.go @@ -2,9 +2,36 @@ package log import ( "fmt" + "os" "time" + + "golang.org/x/term" +) + +const ( + AnsiReset = "\033[0m" + AnsiDim = "\033[0;2m" + AnsiYellow = "\033[1;33m" + AnsiRed = "\033[1;31m" ) +var ( + SetColor = map[Level]string{ + "debug": AnsiDim, + "info": AnsiReset, + "warning": AnsiYellow, + "error": AnsiRed, + } + ResetColor = AnsiReset +) + +func init() { + if !term.IsTerminal(int(os.Stderr.Fd())) { + SetColor = map[Level]string{} + ResetColor = "" + } +} + // Message is a single log message. type Message struct { Timestamp time.Time `json:"timestamp"` @@ -14,5 +41,13 @@ type Message struct { } func (m Message) String() string { - return fmt.Sprintf("%s\t%s\t%s\t%s", m.Timestamp.Format(time.RFC3339), m.Level, m.Labels, m.Message) + return fmt.Sprintf( + "%s%s\t%s\t%s\t%s%s", + SetColor[m.Level], + m.Timestamp.Format(time.RFC3339), + m.Level, + m.Labels, + m.Message, + ResetColor, + ) } diff --git a/message_test.go b/message_test.go index 8e1c8ba..591eb95 100644 --- a/message_test.go +++ b/message_test.go @@ -4,6 +4,7 @@ import ( "testing" "time" + "go.arcalot.io/assert" "go.arcalot.io/log/v2" ) @@ -19,7 +20,11 @@ func TestMessage(t *testing.T) { Labels: map[string]string{"source": "test"}, Message: "Hello world!", } - if m.String() != "2006-01-02T15:04:05Z\terror\tsource=test\tHello world!" { - t.Fatalf("Incorrect message string: %s", m.String()) - } + assert.Equals( + t, + m.String(), + log.SetColor[m.Level]+ + "2006-01-02T15:04:05Z\terror\tsource=test\tHello world!"+ + log.ResetColor, + ) } diff --git a/writer_golog_test.go b/writer_golog_test.go index 42ba261..d3c5dc9 100644 --- a/writer_golog_test.go +++ b/writer_golog_test.go @@ -23,7 +23,7 @@ func TestGoLogger(t *testing.T) { if err != nil { t.Fatal(err) } - if !strings.Contains(buf.String(), "Hello world!\n") { + if !strings.Contains(buf.String(), "Hello world!") { t.Fatalf("failed to find written log message in output") } }