easyCZ / logrotate

Concurrency safe log rotating writer for Golang
https://godoc.org/github.com/easyCZ/logrotate
MIT License
22 stars 7 forks source link
go golang logging writer

logrotate

Concurrency safe logging writer for Golang for application-side log rotation.

Motivation

In general, application-side log rotation should be avoided. Log rotation is best done through logrotate and other tools. However, some applications are constrained to only application-side log rotation and benefit from this package.

Usage

go get github.com/easyCZ/logrotate
package main

import (
    "fmt"
    "log"
    "os"
    "time"

    "github.com/easyCZ/logrotate"
)

func main() {
    logger := log.New(os.Stderr, "logrotate", log.LstdFlags) // Or any other logger conforming to golang's log.Logger
    writer, err := logrotate.New(logger, logrotate.Options{
        // Where should the writer be outputting files?
        // If the directory does not exist, it will be created.
        // Required.
        Directory:       "path/to/my/logs/directory",
        // What is the maximum size of each file?
        // Optional. Use 0 for unlimited.
        MaximumFileSize: 1024 * 1024 * 1024,
        // How often should a new file be created, based on time?
        // Optional. Use 0 to disable time based log rotation.
        MaximumLifetime: time.Hour,
        // How would you like to name your files?
        // Invoked each time a new file is being created.
        FileNameFunc:    logrotate.DefaultFilenameFunc,
    })
    if err != nil {
        // handle err
    }

    // ...

    // Ensure all messages are flushed to files before exiting 
    if err := writer.Close(); err != nil {
        // handle err
    }   
}

Usage with Golang's log.Logger

package main

import (
    "log"
    "os"

    "github.com/easyCZ/logrotate"
)

func main() {
    // Write logrotate's own log lines to stderr
    stderrLogger := log.New(os.Stderr, "logrotate", log.LstdFlags)

    writer, err := logrotate.New(stderrLogger, logrotate.Options{
        Directory: "/path/to/my/logs",
        // see other options above
    })

    // Your application logger, using logrotate as the backing Writer implementation.
    logger := log.New(writer, "application", log.LstdFlags)

    // Ensure all messages are flushed to files before exiting 
    if err := writer.Close(); err != nil {
        // handle err
    }  
}

Usage with logrus

package main

import (
    "os"
    log "github.com/sirupsen/logrus"
    logrotate "github.com/easyCZ/logrotate"
)

func init() {
    writer, err := logrotate.New(logger, logrotate.Options{
        Directory: "path/to/my/logs/directory",
    })
    if err != nil {
        // handle err
    }
    // Output to stdout instead of the default stderr
    // Can be any io.Writer, see below for File example
    log.SetOutput(writer)
}