Change format of log output logrus

Standard logrus-prefixed-formater usage

To achieve this you need to make your own TextFormater which will satisfy logrus Formatter interface. Then when you create your own formater you pass it on logrus struct initialization. Other way arround and close to what you wanna achieve is this formater https://github.com/x-cray/logrus-prefixed-formatter . Based on this formater you can create your own.

In your case you need to use like that

logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: logrus.DebugLevel,
        Formatter: &prefixed.TextFormatter{
            DisableColors: true,
            TimestampFormat : "2006-01-02 15:04:05",
            FullTimestamp:true,
            ForceFormatting: true,
        },
    }

Customized output of logrus-prefixed-formater

Link to gist to use copy of logrus-prefixed-formatter with changed format https://gist.github.com/t-tomalak/146e4269460fc63d6938264bb5aaa1db

I leave this option if u in the end wanna use it, as in this version you have exact format you want, coloring, and other features available in standard formatter


Custom formatter

Third option is to use package create by me https://github.com/t-tomalak/logrus-easy-formatter. It provide simple option to format output as you want and is it only purpose. I removed not necessary options which probably you wouldn't use.

package main

import (
    "os"

    "github.com/sirupsen/logrus"
    "github.com/t-tomalak/logrus-easy-formatter"
)

func main() {
    logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: logrus.DebugLevel,
        Formatter: &easy.Formatter{
            TimestampFormat: "2006-01-02 15:04:05",
            LogFormat:       "[%lvl%]: %time% - %msg%",
        },
    }

    logger.Printf("Log message")
}

This sample code will produce:

[INFO]: 2018-02-27 19:16:55 - Log message

Also I wanna point out that if in the future wanna change formatter there shouldn't be any problems to use i.e. default Logrus TextFormatter/JSONFormatter.


Customized output of logrus-prefixed-formater

If you really don't wanna copy this formatter to your project you can use my fork logrus-prefixed-formater with copy/pasted this code https://github.com/t-tomalak/logrus-prefixed-formatter

You can use it like standard option but remember to change import to my repository in you go file

logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: logrus.DebugLevel,
        Formatter: &prefixed.TextFormatter{
            DisableColors: true,
            TimestampFormat : "2006-01-02 15:04:05",
            FullTimestamp:true,
            ForceFormatting: true,
        },
    }

I adopted this code from https://github.com/x-cray/logrus-prefixed-formatter/blob/master/formatter.go. I created an own formatter struct and implementend an own Format function of the logrus formatter interface. I you only need a text output without color, this might be a simple solution.

// adopted from https://github.com/x-cray/logrus-prefixed-formatter/blob/master/formatter.go
package main

import (
    "bytes"
    "fmt"
    "log"
    "os"
    "strings"

    "github.com/sirupsen/logrus"
)

type LogFormat struct {
    TimestampFormat string
}

func (f *LogFormat) Format(entry *logrus.Entry) ([]byte, error) {
    var b *bytes.Buffer

    if entry.Buffer != nil {
        b = entry.Buffer
    } else {
        b = &bytes.Buffer{}
    }

    b.WriteByte('[')
    b.WriteString(strings.ToUpper(entry.Level.String()))
    b.WriteString("]:")
    b.WriteString(entry.Time.Format(f.TimestampFormat))

    if entry.Message != "" {
        b.WriteString(" - ")
        b.WriteString(entry.Message)
    }

    if len(entry.Data) > 0 {
        b.WriteString(" || ")
    }
    for key, value := range entry.Data {
        b.WriteString(key)
        b.WriteByte('=')
        b.WriteByte('{')
        fmt.Fprint(b, value)
        b.WriteString("}, ")
    }

    b.WriteByte('\n')
    return b.Bytes(), nil
}

func main() {
    formatter := LogFormat{}
    formatter.TimestampFormat = "2006-01-02 15:04:05"

    logrus.SetFormatter(&formatter)
    log.SetOutput(os.Stderr)

    logrus.WithFields(logrus.Fields{
        "animal": "walrus",
        "size":   10,
    }).Info("A group of walrus emerges from the ocean")
    logrus.Info("ugh ugh ugh ugh")
}

I guess I am quite late to this, but recently I was also struggling to get this logging message format customized and I was hoping to get this done preferably in a simpler way. Coming from Python, this wasn't really as straight forward as I though it to be and logrus documentation also isn't very clear on this.

So I had to go through their source code to actually get this done. Here is my code for the same.

type myFormatter struct {
    log.TextFormatter
}

func (f *myFormatter) Format(entry *log.Entry) ([]byte, error) {
// this whole mess of dealing with ansi color codes is required if you want the colored output otherwise you will lose colors in the log levels
    var levelColor int
    switch entry.Level {
    case log.DebugLevel, log.TraceLevel:
        levelColor = 31 // gray
    case log.WarnLevel:
        levelColor = 33 // yellow
    case log.ErrorLevel, log.FatalLevel, log.PanicLevel:
        levelColor = 31 // red
    default:
        levelColor = 36 // blue
    }
    return []byte(fmt.Sprintf("[%s] - \x1b[%dm%s\x1b[0m - %s\n", entry.Time.Format(f.TimestampFormat), levelColor, strings.ToUpper(entry.Level.String()), entry.Message)), nil
}

func main() {
    f, _ := os.OpenFile("log.txt", os.O_CREATE|os.O_WRONLY, 0777)
    logger := &log.Logger{
        Out:   io.MultiWriter(os.Stderr, f),
        Level: log.InfoLevel,
        Formatter: &myFormatter{log.TextFormatter{
            FullTimestamp:          true,
            TimestampFormat:        "2006-01-02 15:04:05",
            ForceColors:            true,
            DisableLevelTruncation: true,
        },
        },
    }
    logger.Info("Info message")
    logger.Warning("Warning message")

Here is the output

± go run main.go                                                                                                                                                                                                                    <<<
[2019-05-13 18:10:34] - INFO - Info message
[2019-05-13 18:10:34] - WARNING - Warning message

PS: I am very new to this, so if you guys there can be a better neat way of doing this, please do share.

Tags:

Go