Categorygithub.com/go-project-pkg/log
modulepackage
0.1.4
Repository: https://github.com/go-project-pkg/log.git
Documentation: pkg.go.dev

# README

go-project-pkg/log

Wrap zap for easy using.

Installation

$ go get -u github.com/go-project-pkg/log

Usage

Use default logger:

import "github.com/go-project-pkg/log"

func main() {
    defer log.Sync()

    log.Info("Hello world!")
    log.Info("Hello ", log.String("string_key", "value"), log.Int("int_key", 666))
    log.Infof("Hello %s!", "world")
    log.Infow("Hello ", "string_key", "value", "int_key", 666)

    log.WithName("logger1").Warn("I am logger1")
    log.WithName("logger2").Warn("I am logger2")

    log.WithFields(log.String("f1", "value"), log.Int("f2", 888)).Error("Hello world!")
    log.WithName("logger3").WithFields(log.String("f1", "value"), log.Int("f2", 888)).Error("Hello world!")

    ctx := log.WithFields(String("f1", "value"), Int("f2", 888)).ToContext(context.Background())
    log.FromContext(ctx).Info("hello world!")
}

Custom your own logger:

import "github.com/go-project-pkg/log"

func init() {
    opts := &log.Options{
        Name:              "",        // logger name
        Level:             "debug",   // debug, info, warn, error, panic, dpanic, fatal
        Format:            "console", // json, console/text
        DisableColor:      false,
        DisableCaller:     false,
        DisableStacktrace: false,
        // Aplication's all levels logs.
        OutputPaths: []string{
            "stdout", // os.Stdout
            "/var/log/app/app.log",
        },
        // Only include zap internal errors, not include application's any level logs.
        ErrorOutputPaths: []string{
            "stderr", // os.Stderr
            "/var/log/app/error.log",
        },
        // Enable log files rotation feature or not.
        EnableRotate: true,
        // Take effect when EnableRotate is true.
        RotateOptions: &log.RotateOptions{
            // Maximum size in megabytes of the log file before it gets rotated.
            // Default: 100, if the value is 0, the log files will not be rotated.
            MaxSize:    1,
            // Saved days, default 0, means no limit.
            MaxAge:     30,
            // Saved count, default 0, means no limit.
            MaxBackups: 2,
            // Use local time in log file name, default false.
            LocalTime:  true,
            // Gzip log files, default false.
            Compress:   false,
        },
    }

    log.Init(opts)
}

func main() {
    defer log.Sync()

    log.Info("Hello world!")
    log.Info("Hello ", log.String("string_key", "value"), log.Int("int_key", 666))
    log.Infof("Hello %s!", "world")
    log.Infow("Hello ", "string_key", "value", "int_key", 666)

    log.WithName("logger1").Warn("I am logger1")
    log.WithName("logger2").Warn("I am logger2")

    log.WithFields(log.String("f1", "value"), log.Int("f2", 888)).Error("Hello world!")
    log.WithName("logger3").WithFields(log.String("f1", "value"), log.Int("f2", 888)).Error("Hello world!")

    ctx := log.WithFields(String("f1", "value"), Int("f2", 888)).ToContext(context.Background())
    log.FromContext(ctx).Info("hello world!")

    // log files rotation test
    for i := 0; i <= 20000; i++ {
        log.Infof("hello world: %d", i)
    }
}

Use log.C(ctx context.Context) for getting logger with additional log fields by cooperating with gin's middleware:

import "github.com/go-project-pkg/log"

// A middleware of gin for setting logger that with custom fileds to gin.Context
func Context() gin.HandlerFunc {
    return func(c *gin.Context) {
        l := log.WithFields(
            log.String("x-request-id", c.GetString(XRequestIDKey)),
            log.String("username", c.GetString(UsernameKey)),
        )
        c.Set(log.ContextLoggerName, l)

        c.Next()
    }
}

// Others place that use the logger.
func (u *UserController) Get(c *gin.Context) {
    // Get logger that with fileds from gin.Context and log a message.
    log.C(c).Debug("user get called")
}

You can add hooks to realize some useful features, like alerting when encountering error logs.

Use log.SetHooks(hooks ...log.Hook) for global logger:

func main() {
    defer log.Sync()

    monitorHook1 := func(entry log.Entry) error {
        if entry.Level >= log.ErrorLevel {
            fmt.Printf("hook1 alert! log entry: %v", entry)
        }

        // This error is zap internal error, and it will write to 'ErrorOutputPaths'.
        return errors.New("alert hook failed")
    }

    monitorHook2 := func(entry log.Entry) error {
        if entry.Level >= log.ErrorLevel {
            fmt.Println("hook2 alert! log entry: %v", entry)
        }

        return nil
    }

    log.SetHooks(monitorHook1, monitorHook2)

    log.Error("set hooks: server error")
}

Use log.WithHooks(hooks ...log.Hook) for current logger instance:

func main() {
    defer log.Sync()

    monitorHook1 := func(entry log.Entry) error {
        if entry.Level >= log.ErrorLevel {
            fmt.Println("hook1 alert! log entry: %v", entry)
        }

        // This error is zap internal error, and it will write to 'ErrorOutputPaths'.
        return errors.New("alert hook failed")
    }

    log.WithHooks(monitorHook1).Error("with hooks: server error")
}

License

This project is under the MIT License. See the LICENSE file for the full license text.

# Functions

Init package default logger instance with given options.
New logger instance with given options.
SetHooks and replace global logger.

# Constants

ContextLoggerName is logger key from context.Context.

# Variables

Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
User can directly use package level functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
User can directly use package level functions.
User can directly use package level functions.
Alias for zap level.
User can directly use package level functions.
User can directly use package level functions.
User can directly use package level functions.
Alias for zap level.
User can directly use package level functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
User can directly use package level functions.
User can directly use package level functions.
Alias for zap level.
Alias for zap type functions.
User can directly use package level functions.
User can directly use package level functions.
User can directly use package level functions.
Alias for zap level.
User can directly use package level functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
User can directly use package level functions.
User can directly use package level functions.
User can directly use package level functions.
User can directly use package level functions.
Alias for zap level.
User can directly use package level functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
User can directly use package level functions.
User can directly use package level functions.
Alias for zap level.
User can directly use package level functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
User can directly use package level functions.
Alias for zap type functions.
Alias for zap type functions.
User can directly use package level functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
Alias for zap type functions.
User can directly use package level functions.
User can directly use package level functions.
Alias for zap level.
User can directly use package level functions.
User can directly use package level functions.
User can directly use package level functions.
User can directly use package level functions.

# Structs

Logger ...
Options for logger.
RotateOptions for log rotate feature.

# Type aliases

Entry
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author