Skip to content

Commit

Permalink
split printer package to 3 packages
Browse files Browse the repository at this point in the history
Split printer package to 3 packages: printer, console and logadapter

`printer` package is not very obvious to newcomers. If someone is searching for console or log adapters he will not realize that printer package does that.
  • Loading branch information
elgopher committed Jan 27, 2022
1 parent 0743cc6 commit d7a1bd1
Show file tree
Hide file tree
Showing 14 changed files with 170 additions and 88 deletions.
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Tiny **structured logging** abstraction or facade for various logging libraries,

## Supported logging libraries (via adapters)

[logrus](adapter/logrusadapter), [zap](adapter/zapadapter), [zerolog](adapter/zerologadapter), [glog](adapter/glogadapter), [log15](adapter/log15adapter) and [standard fmt and log packages](adapter/printer)
[logrus](adapter/logrusadapter), [zap](adapter/zapadapter), [zerolog](adapter/zerologadapter), [glog](adapter/glogadapter), [log15](adapter/log15adapter), [standard log](adapter/logadapter) and [console](adapter/console)

## When to use?

Expand Down Expand Up @@ -71,13 +71,13 @@ package main
import (
"context"

"github.com/elgopher/yala/adapter/printer"
"github.com/elgopher/yala/adapter/console"
"lib"
)

// End user decides what library to plug in.
func main() {
adapter := printer.StdoutAdapter() // will use fmt.Println
adapter := console.StdoutAdapter() // will print messages to console
lib.SetLogAdapter(adapter)

ctx := context.Background()
Expand Down Expand Up @@ -114,14 +114,15 @@ func (l YourLib) Method(ctx context.Context) {


// end user code
adapter := printer.StdoutAdapter()
adapter := console.StdoutAdapter()
lib := NewLibrary(adapter)
```

### How to use existing adapters

* [Logrus](adapter/logrusadapter/_example/main.go)
* [fmt.Println and standard log package](adapter/printer/_example/main.go)
* [standard log package](adapter/logadapter/_example/main.go)
* [print logs to console using simplified adapter](adapter/console/_example/main.go)
* [Zap](adapter/zapadapter/_example/main.go)
* [Zerolog](adapter/zerologadapter/_example/main.go)
* [glog](adapter/glogadapter/_example/main.go)
Expand Down
24 changes: 24 additions & 0 deletions adapter/console/_example/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package main

import (
"context"
"errors"

"github.com/elgopher/yala/adapter/console"
"github.com/elgopher/yala/logger"
)

var ErrSome = errors.New("ErrSome")

// This example shows how to use yala with minimal console adapter
func main() {
ctx := context.Background()

// log to console, stdout
log := logger.Local{Adapter: console.StdoutAdapter()}

log.Debug(ctx, "Hello fmt")
log.With(ctx, "field_name", "field_value").Info("Some info")
log.With(ctx, "parameter", "some value").Warn("Deprecated configuration parameter. It will be removed.")
log.WithError(ctx, ErrSome).Error("Some error")
}
35 changes: 35 additions & 0 deletions adapter/console/console.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// (c) 2022 Jacek Olszak
// This code is licensed under MIT license (see LICENSE for details)

package console

import (
"fmt"
"io"
"os"

"github.com/elgopher/yala/adapter/printer"
"github.com/elgopher/yala/logger"
)

// StdoutAdapter returns a logger.Adapter implementation which prints log messages to stdout.
func StdoutAdapter() logger.Adapter { // nolint
return printer.Adapter{Printer: WriterPrinter{os.Stdout}}
}

// StderrAdapter returns a logger.Adapter implementation which prints log messages to stderr.
func StderrAdapter() logger.Adapter { // nolint
return printer.Adapter{Printer: WriterPrinter{os.Stderr}}
}

type WriterPrinter struct {
Writer io.Writer
}

func (p WriterPrinter) Println(args ...interface{}) {
if p.Writer == nil {
return
}

_, _ = fmt.Fprintln(p.Writer, args...)
}
21 changes: 21 additions & 0 deletions adapter/console/console_bench_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// (c) 2022 Jacek Olszak
// This code is licensed under MIT license (see LICENSE for details)

package console_test

import (
"testing"

"github.com/elgopher/yala/adapter/console"
"github.com/elgopher/yala/adapter/internal/benchmark"
"github.com/elgopher/yala/adapter/printer"
)

func BenchmarkPrinter(b *testing.B) {
adapter := printer.Adapter{
Printer: console.WriterPrinter{
Writer: benchmark.DiscardWriter{},
},
}
benchmark.Adapter(b, adapter)
}
20 changes: 20 additions & 0 deletions adapter/console/console_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// (c) 2022 Jacek Olszak
// This code is licensed under MIT license (see LICENSE for details)

package console_test

import (
"testing"

"github.com/elgopher/yala/adapter/console"
"github.com/stretchr/testify/assert"
)

func TestWriterPrinter_Println(t *testing.T) {
t.Run("should not panic when Writer is nil", func(t *testing.T) {
p := console.WriterPrinter{Writer: nil}
assert.NotPanics(t, func() {
p.Println("")
})
})
}
28 changes: 28 additions & 0 deletions adapter/logadapter/_example/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package main

import (
"context"
"errors"
"log"
"os"

"github.com/elgopher/yala/adapter/logadapter"
"github.com/elgopher/yala/logger"
)

var ErrSome = errors.New("ErrSome")

// This example shows how to use yala with standard `log` package
func main() {
ctx := context.Background()

// log using standard log package
standardLog := log.New(os.Stdout, "", log.LstdFlags)
adapter := logadapter.Adapter(standardLog)
yalaLogger := logger.Local{Adapter: adapter}

yalaLogger.Debug(ctx, "Hello standard log")
yalaLogger.With(ctx, "f1", "v1").With("f2", "f2").Info("Some info")
yalaLogger.With(ctx, "parameter", "some").Warn("Deprecated configuration parameter. It will be removed.")
yalaLogger.WithError(ctx, ErrSome).Error("Some error")
}
12 changes: 12 additions & 0 deletions adapter/logadapter/logadapter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package logadapter

import (
"log"

"github.com/elgopher/yala/adapter/printer"
"github.com/elgopher/yala/logger"
)

func Adapter(l *log.Logger) logger.Adapter { // nolint
return printer.Adapter{Printer: l}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
// (c) 2022 Jacek Olszak
// This code is licensed under MIT license (see LICENSE for details)

package printer_test
package logadapter_test

import (
"log"
"testing"

"github.com/elgopher/yala/adapter/internal/benchmark"
"github.com/elgopher/yala/adapter/printer"
)

func BenchmarkPrinter(b *testing.B) {
adapter := printer.Adapter{Printer: printer.WriterPrinter{Writer: benchmark.DiscardWriter{}}}
standardLog := log.New(benchmark.DiscardWriter{}, "", log.LstdFlags)
adapter := printer.Adapter{Printer: standardLog}
benchmark.Adapter(b, adapter)
}
36 changes: 0 additions & 36 deletions adapter/printer/_example/main.go

This file was deleted.

25 changes: 0 additions & 25 deletions adapter/printer/printer.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ package printer

import (
"context"
"fmt"
"io"
"os"
"strings"

"github.com/elgopher/yala/adapter/logfmt"
Expand All @@ -28,28 +25,6 @@ type Printer interface {
Println(...interface{})
}

// StderrAdapter returns a logger.Adapter implementation which prints log messages to stderr using `fmt` package.
func StderrAdapter() Adapter {
return Adapter{Printer: WriterPrinter{os.Stderr}}
}

// StdoutAdapter returns a logger.Adapter implementation which prints log messages to stdout using `fmt` package.
func StdoutAdapter() Adapter {
return Adapter{Printer: WriterPrinter{os.Stdout}}
}

type WriterPrinter struct {
Writer io.Writer
}

func (p WriterPrinter) Println(args ...interface{}) {
if p.Writer == nil {
return
}

_, _ = fmt.Fprintln(p.Writer, args...)
}

func (f Adapter) Log(ctx context.Context, entry logger.Entry) {
if f.Printer == nil {
return
Expand Down
28 changes: 14 additions & 14 deletions adapter/printer/printer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ package printer_test

import (
"context"
"fmt"
"io"
"strings"
"testing"

Expand Down Expand Up @@ -65,14 +67,12 @@ func TestAdapter_Log(t *testing.T) {

for name, test := range tests {
t.Run(name, func(t *testing.T) {
var builder strings.Builder
adapter := printer.Adapter{
Printer: printer.WriterPrinter{Writer: &builder},
}
var actual strings.Builder
adapter := printer.Adapter{Printer: stringPrinter{&actual}}
// when
adapter.Log(ctx, test.entry)
// then
assert.Equal(t, test.expectedMessage, builder.String())
assert.Equal(t, test.expectedMessage, actual.String())
})
}

Expand All @@ -87,17 +87,17 @@ func TestAdapter_Log(t *testing.T) {
})
}

func TestWriterPrinter_Println(t *testing.T) {
t.Run("should not panic when Writer is nil", func(t *testing.T) {
p := printer.WriterPrinter{Writer: nil}
assert.NotPanics(t, func() {
p.Println("")
})
})
}

type stringError string

func (e stringError) Error() string {
return string(e)
}

type stringPrinter struct {
io.StringWriter
}

func (p stringPrinter) Println(i ...interface{}) {
s := fmt.Sprintln(i...)
_, _ = p.WriteString(s)
}
4 changes: 2 additions & 2 deletions logger/_examples/filter/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import (
"context"
"strings"

"github.com/elgopher/yala/adapter/printer"
"github.com/elgopher/yala/adapter/console"
"github.com/elgopher/yala/logger"
)

// This advanced example shows how to filter out messages starting with given prefix
func main() {
adapter := printer.StdoutAdapter()
adapter := console.StdoutAdapter()

// creates an adapter which filters out messages
filterAdapter := FilterOutMessages{
Expand Down
4 changes: 2 additions & 2 deletions logger/_examples/reuse/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ package main
import (
"context"

"github.com/elgopher/yala/adapter/printer"
"github.com/elgopher/yala/adapter/console"
"github.com/elgopher/yala/logger"
)

// This example shows how to reuse loggers
func main() {
ctx := context.Background()

log := logger.Local{Adapter: printer.StdoutAdapter()}
log := logger.Local{Adapter: console.StdoutAdapter()}

// requestLogger will log all messages with at least two fields: request_id and user
requestLogger := log.With(ctx, "request_id", "123").With("user", "elgopher")
Expand Down
4 changes: 2 additions & 2 deletions logger/_examples/tags/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ package main
import (
"context"

"github.com/elgopher/yala/adapter/printer"
"github.com/elgopher/yala/adapter/console"
"github.com/elgopher/yala/logger"
)

const tag = "tag"

// This advanced example shows how to log messages with additional field taken from context.Context
func main() {
adapter := printer.StdoutAdapter()
adapter := console.StdoutAdapter()

// creates an adapter which adds field from context to each logged message.
addFieldAdapter := AddFieldFromContextAdapter{NextAdapter: adapter}
Expand Down

0 comments on commit d7a1bd1

Please sign in to comment.