2019-02-23 03:06:30 +03:00

67 lines
1.5 KiB
Go

package levelpad
import (
"strings"
"time"
"github.com/sirupsen/logrus"
)
const (
// Default log format will output [INFO]: 2006-01-02T15:04:05Z07:00 - Log message
defaultLogFormat = "[%lvl%]: %time% - %msg%"
defaultTimestampFormat = time.RFC3339
)
func padRight(str, pad string, length int) string {
for {
str += pad
if len(str) > length {
return str[0:length]
}
}
}
// Formatter implements logrus.Formatter interface.
type Formatter struct {
// Timestamp format
TimestampFormat string
// Available standard keys: time, msg, lvl
// Also can include custom fields but limited to strings.
// All of fields need to be wrapped inside %% i.e %time% %msg%
LogFormat string
LevelPad int
}
// Format building log message.
func (f *Formatter) Format(entry *logrus.Entry) ([]byte, error) {
output := f.LogFormat
if output == "" {
output = defaultLogFormat
}
if f.TimestampFormat == "" {
f.TimestampFormat = defaultTimestampFormat
}
// replace timestamp
output = strings.Replace(output, "%time%", entry.Time.Format(f.TimestampFormat), 1)
// replace message text
output = strings.Replace(output, "%msg%", entry.Message, 1)
// replace level
level := strings.ToUpper(entry.Level.String())
if f.LevelPad != 0 {
level = padRight(level, " ", f.LevelPad)
}
output = strings.Replace(output, "%lvl%", level, 1)
// replace data
for k, v := range entry.Data {
if s, ok := v.(string); ok {
output = strings.Replace(output, "%"+k+"%", s, 1)
}
}
return []byte(output), nil
}