package module
Version: v1.6.15 Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Mar 5, 2023 License: MIT Imports: 5 Imported by: 6



Go GitHub tag (latest SemVer) Sourcegraph GoDoc go.dev Go Report Card Coverage Status FOSSA Status

an enhancement for logrus. logex attaches the context caller info to the logging output.

Since v1.6.0, logex remove the adapters to zap and zerolog.

The only shipped adapter is logrus.

The original codes moved to ./_excluded/.

The primary reason is for reducing the target binary size. Those adapters imports the more third-party codes and can't be optimized due its refers are in our adapters.

So the only way to avoid importing the unnecessary libs is, remove them from our logex framework and allow you adapt them back again when you really want them.

Since v1.5.56, logex moved to Go Modules 1.17 and higher, the lower versions can't be supported.

Since v1.2.0, logex allows switching the logging backends (such as logrus, zap, ...) transparently.




  • v1.6.15

    • unify detectors api entry to detects pkg, user can ignore buildtags and states in readonly accessing.
  • v1.6.9

    • added a func exec.LookPath deleted at earlier version
  • v1.6.7

    • upgrade deps
  • v1.6.5

    • better output with error format
    • upgrade deps
  • v1.6.3

    • better error format
  • v1.6.1

    • upgrade hedzr/log to support: pass nil to log.Fatal/Panic will safely return to caller.
  • v1.6.0

    • upgrade errors.v3 to compliant with go1.20+.
    • BREAK: removed adapters to zap and zerolog to reduce binary size
  • v1.5.57

    • fixed GetExecutablePath().
      Old implements might return an invalid path string if a searchable executable is invoking from current directory.


Build logger transparently

We provide the ability to switch logging backends transparently now.

The supported backends currently are: logrus, zag, zerolog.

A sample config file looks like:


  # runmode: devel  # devel, prod

    # The field 'level' will be reset to "debug" while the app is started up within a debugger
    # available values are:
    #   "disable"/"off", "panic", "fatal", "error", "warn", "info", "debug", "trace"
    level:  info
    format: text                  # text, json, logfmt, ...
    backend: sugar                # zap, sugar(sugared-zap) or logrus, zerolog
    target: file                  # console, file
    directory: /var/log/$APPNAME

Load it to Config structure:

import "github.com/hedzr/log"
var config *log.LoggerConfig = log.NewLoggerConfig()
// ...

And build the backend:

import "github.com/hedzr/logex/build"
logger := build.New(config)
logger.Debugf("int value = %v", intVal)
Or build a logger backend directly
import "github.com/hedzr/logex/logx/logrus"
logrus.New(level string, traceMode, debugMode bool, opts ...Opt)

import "github.com/hedzr/logex/logx/zap"
zap.New(level string, traceMode, debugMode bool, opts ...Opt)

import "github.com/hedzr/logex/logx/zap/sugar"
sugar.New(level string, traceMode, debugMode bool, opts ...Opt)

import "github.com/hedzr/logex/logx/zerolog"
zerolog.New(level string, traceMode, debugMode bool, opts ...Opt)

Or, build the logger with pure go codes
import "github.com/hedzr/logex/build"
// config:=build.NewLoggerConfig()
config := build.NewLoggerConfigWith(true, "logrus", "debug")
logger := build.New(config)
logger.Debugf("int value = %v", intVal)

That's all stocked.

Integrating your backend

You can wrap a logging backend with log.Logger and register it into logex/build. Why we should do it like this? A universal logger creating interface from logex/build will simplify the application initiliazing coding, esp. in a framework.

import "github.com/hedzr/logex/build"

build.RegisterBuilder("someone", createSomeLogger)

func createSomeLogger(config *log.LoggerConfig) log.Logger {
 //... wrapping your logging backend to log.Logger

// and use it:
build.New(build.NewLoggerConfigWith(true, "someone", "debug"))
build.New(build.NewLoggerConfigWith(false, "someone", "info"))
Legacy tools
Ignore the extra caller frames

If you are writing logging func wrappers, you might ignore the extra caller frames for those wrappers:

func wrong(err error, fmt string, args interface{}) {
        logex.SKIP: 1,  // ignore wrong() frame
    }).Errorf(fmt, args)

func wrongInner(err error, fields logrus.Fields, fmt string, args interface{}) {
    logrus.WithError(err).WithFields(fields).Errorf(fmt, args)

func wrongwrong(err error, fmt string, args interface{}) {
    wrongInner(err, logrus.Fields{
        logex.SKIP: 2,  // ignore wrongwrong() and wrongInner() frame
    }, fmt, args...)

For go test

make logrus works in go test

The codes is copied from:


And in a test function, you could code now:

   func TestFoo(t *testing.T) {
     defer logex.CaptureLog(t).Release()
     // …



FOSSA Status



Package logex is a logging helper library which append the context call info to logging output for locating



View Source
const (
	// AppName const
	AppName = "logex"
	// Version const
	Version = "1.6.15"
	// VersionInt const
	VersionInt = 0x01060f
View Source
const SKIP = formatter.SKIP

SKIP is a constant key Deprecated it's obsoleted


This section is empty.


func EnableWith added in v1.0.3

func EnableWith(lvl log.Level, opts ...Option)

EnableWith makes logrus logging enabled. Deprecated it's obsoleted

func GetLevel

func GetLevel() log.Level

GetLevel returns the current logging level in log/logex subsystem


type LogCapturer added in v1.0.1

type LogCapturer interface {

LogCapturer reroutes testing.T log output

func CaptureLog added in v1.0.1

func CaptureLog(tb testing.TB) LogCapturer

CaptureLog redirects logrus output to testing.Log

func CaptureLogOld added in v1.6.5

func CaptureLogOld(tb testing.TB) LogCapturer

CaptureLogOld redirects logrus output to testing.Log

func CaptureLogV added in v1.6.5

func CaptureLogV(tb testing.TB) LogCapturer

CaptureLog redirects logrus output to testing.Log

type Option added in v1.1.9

type Option func()

Option specify option function. Deprecated it's obsoleted


Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL