Skip to content

Latest commit

 

History

History

example

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Examples

Production ready logger usage with opentelemetry support

import (
    "github.com/damianopetrungaro/golog"
    "github.com/damianopetrungaro/golog/opentelemetry"
)

func NewLogger(lvl golog.Level) (golog.Logger, golog.Flusher) {
	w := golog.NewBufWriter(
        golog.NewJsonEncoder(),
		bufio.NewWriter(os.Stdout),
        golog.DefaultErrorHandler(),
		lvl,
	)
	
	logger := golog.New(
		w,
		golog.NewLevelCheckerOption(lvl),
		golog.NewTimestampDecoratorOption("timestamp", time.RFC3339Nano),
		golog.NewStackTraceDecoratorOption("stacktrace", 5),
		opentelemetry.TraceDecoratorOption(),
	)

	// force flushing data to the disk every 5 seconds
	flusher := golog.NewTickFlusher(stdoutWriter, 5*time.Second)
	go func() {
		if err := flusher.Flush(); err != nil {
			logger.With(golog.Err(err)).Warn(ctx, "log entries were not flushed")
		}
	}()

	golog.SetLogger(logger)
	golog.SetCheckLogger(logger)

	return logger, flusher
}

Production ready logger usage with opencensus support

import (
    "github.com/damianopetrungaro/golog"
    "github.com/damianopetrungaro/golog/opencensus"
)

func NewLogger(lvl golog.Level) (golog.Logger, golog.Flusher) {
	w := golog.NewBufWriter(
        golog.NewJsonEncoder(),
		bufio.NewWriter(os.Stdout),
        golog.DefaultErrorHandler(),
		lvl,
	)
	
	logger := golog.New(
		w,
		golog.NewLevelCheckerOption(lvl),
		golog.NewTimestampDecoratorOption("timestamp", time.RFC3339Nano),
		golog.NewStackTraceDecoratorOption("stacktrace", 5),
        opencensus.TraceDecoratorOption(),
	)

	// force flushing data to the disk every 5 seconds
	flusher := golog.NewTickFlusher(stdoutWriter, 5*time.Second)
	go func() {
		if err := flusher.Flush(); err != nil {
			logger.With(golog.Err(err)).Warn(ctx, "log entries were not flushed")
		}
	}()

	golog.SetLogger(logger)
	golog.SetCheckLogger(logger)

	return logger, flusher
}

Production ready logger usage with datadog and opentelemetry support

import (
    "github.com/damianopetrungaro/golog"
    "github.com/damianopetrungaro/golog/datadog"
    "github.com/damianopetrungaro/golog/opentelemetry"
)

func NewLogger(lvl golog.Level) (golog.Logger, golog.Flusher) {
    w := golog.NewBufWriter(
	    datadog.NewJsonEncoder(),
        bufio.NewWriter(os.Stdout),
        golog.DefaultErrorHandler(),
        lvl,
    )
    
    logger := golog.New(
        w,
        golog.NewLevelCheckerOption(lvl),
        golog.NewTimestampDecoratorOption("timestamp", time.RFC3339Nano),
        golog.NewStackTraceDecoratorOption("stacktrace", 5),
        opentelemetry.TraceDecoratorOption(),
        opentelemetry.CustomTraceDecoratorOption(
            datadog.TraceIDKey,
            datadog.TraceIDFromHexFormat,
            datadog.SpanIDKey,
            datadog.SpanIDFromHexFormat,
        ),
    )
    
    // force flushing data to the disk every 5 seconds
    flusher := golog.NewTickFlusher(stdoutWriter, 5*time.Second)
    go func() {
        if err := flusher.Flush(); err != nil {
            logger.With(golog.Err(err)).Warn(ctx, "log entries were not flushed")
        }
    }()
    
    golog.SetLogger(logger)
    golog.SetCheckLogger(logger)
    
    return logger, flusher
}

Production ready logger usage with sentry and stdout support

import (
    "github.com/damianopetrungaro/golog"
    "github.com/damianopetrungaro/golog/sentry"
    goSentry "github.com/getsentry/sentry-go"
)

func NewLogger(lvl golog.Level) (golog.Logger, golog.Flusher) {
    jsonEncoder := datadog.NewJsonEncoder()
    errHandler := golog.DefaultErrorHandler()
    
    stdoutWriter := golog.NewBufWriter(
        jsonEncoder,
        bufio.NewWriter(os.Stdout),
        errHandler,
        lvl,
    )
    
    sentryWriter := &sentry.Writer{
        Encoder:                   jsonEncoder,
        Hub:                       goSentry.NewHub(client, goSentry.NewScope()),
        ErrHandler:                errHandler,
        DefaultLevel:              lvl,
        CaptureExceptionFromLevel: lvl,
    }

    // create a writer which will write to sentry for error and fatal error
    multiWriter := golog.NewMultiWriter(stdoutWriter, sentryWriter)
    w := golog.NewLeveledWriter(
        stdoutWriter,
        golog.DefaultLeveledWriterOptionFunc(golog.ERROR, multiWriter),
        golog.DefaultLeveledWriterOptionFunc(golog.FATAL, multiWriter),
    )
    
    logger := golog.New(
        w,
        golog.NewLevelCheckerOption(lvl),
        golog.NewTimestampDecoratorOption("timestamp", time.RFC3339Nano),
        golog.NewStackTraceDecoratorOption("stacktrace", 5),
    )
    // force flushing data to the disk every 5 seconds
    flusher := golog.NewTickFlusher(stdoutWriter, 5*time.Second)
    go func() {
        if err := flusher.Flush(); err != nil {
            logger.With(golog.Err(err)).Warn(ctx, "log entries were not flushed")
        }
    }()
    
    golog.SetLogger(logger)
    golog.SetCheckLogger(logger)
    
    return logger, flusher
}