Skip to content
/ logger Public

another GO logger. The main line is to provide a friendly and fast API to send your log wherever you want.

License

Notifications You must be signed in to change notification settings

gol4ng/logger

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

86 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Logger

gol4ng/logger: Golang logger

Go Report Card Maintainability Test Coverage Build Status GoDoc

Gol4ng/Logger is another GO logger. The main line is to provide a friendly and fast API to send your log whenever you want.

Why another one?

When i start GO i searched a logger that can be simple to use, efficient, multi output, multi formats and quite easy to extend. That's why i created this logger with built-in handlers(process a log), formatters(format log in another representation), middlewares(log modification before handler)

Installation

go get -u github.com/gol4ng/logger

Quick Start

package main

import (
	"os"
	"runtime"
	
	"github.com/gol4ng/logger"
	"github.com/gol4ng/logger/formatter"
	"github.com/gol4ng/logger/handler"
)

func main(){
	// logger will print on STDOUT with default line format
	l := logger.NewLogger(handler.Stream(os.Stdout, formatter.NewDefaultFormatter(formatter.WithContext(true))))
	
	l.Debug("Go debug information", logger.String("go_os", runtime.GOOS), logger.String("go_arch", runtime.GOARCH))
	// <debug> MyExample message {"go_arch":"amd64","go_os":"darwin"}
	
	l.Info("Another")
    //<info> Another
}

Logger interface

This library expose some quite simple interfaces.

Simplest one

type LogInterface interface {
	Log(message string, level Level, field ...Field)
}

The friendly one

type LoggerInterface interface {
	LogInterface
	Debug(message string, field ...Field)
	Info(message string, field ...Field)
	Notice(message string, field ...Field)
	Warning(message string, field ...Field)
	Error(message string, field ...Field)
	Critical(message string, field ...Field)
	Alert(message string, field ...Field)
	Emergency(message string, field ...Field)
}

Handlers

Handlers are log entry processor. It received a log entry and process it in order to send log to it's destination

Available handlers:

  • stream it will write formatted log in io.Writer
  • socket it will write formatted log in net.Conn
  • chan send all entry in provided go channel
  • gelf format to gelf and send to gelf server (TCP or UDP gzipped chunk)
  • group it will send log to all provided child handlers
  • rotate it will write formatted log in file and rotate file (mode: interval/archive)
  • syslog send formatted log in syslog server

Formatters

The formatter convert log entry to a string representation (text, json, gelf...) They are often inject in handler to do the conversion process

Available formatters:

  • default <info> My log message {"my_key":"my_value"}
  • line it's just a fmt.Sprintf facade format:%s %s %s will produce My log message info <my_key:my_value>
  • gelf format log entry to gelf {"version":"1.1","host":"my_fake_hostname","level":6,"timestamp":513216000.000,"short_message":"My log message","full_message":"<info> My log message [ <my key:my_value> ]","_my_key":"my_value"}
  • json format log entry to json {"Message":"My log message","Level":6,"Context":{"my_key":"my_value"}}

Middlewares

The middleware are handler decorator/wrapper. It will allow you to do some process around child handler

Available middleware:

  • caller it will add caller file/line to context <file:/my/example/path/file> <line:31>
  • context it permit to have a default context value useful when you want to set global context value
  • error it will print provided handler error (can be configure to silent it)
  • filter it will permit to filter log entry level filter are available or you can use your own callback filter
  • placeholder it will replace log message placeholder with contextual value
  • recover it will convert handler panic to error
  • timestamp it will add timestamp to log context

Writers

Writers are use by handler to write/send log to appropriate destination

Available writer:

  • compress it will compress log to gzip/zlib
  • gelf_chunked it will chunked log entry into gelf chunk
  • rotate it will write in io.Writer and rotate writer on demand
  • time_rotate it's a rotate writer that rotate with time.Ticker

Todo

  • benchmark

  • Implement all the handler

    • SSE http endpoint
    • websocket server
    • socket server
    • https://craig.is/writing/chrome-logger
    • fingercross
    • grpc / protobuf
    • curl
    • Mail
    • Slack
    • hipchat
    • amqp
    • redis
    • elasticsearch
    • newrelic
    • browser console
    • couchdb
    • cube
    • ifttt
    • InsightOps
    • mandrill
    • pushover
    • raven
    • rollbar
    • sampling
    • LogEntries
    • ???
  • Implement all the formatter

    • html
    • proto
    • slack
    • flowdoc
    • fluentd
    • logstash
    • mongodb
    • wildfire

Idea

  • log server with log routing