66 lines
1.4 KiB
Go
66 lines
1.4 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
|
|
}
|
|
|
|
timestampFormat := f.TimestampFormat
|
|
if timestampFormat == "" {
|
|
timestampFormat = defaultTimestampFormat
|
|
}
|
|
|
|
output = strings.Replace(output, "%time%", entry.Time.Format(timestampFormat), 1)
|
|
|
|
output = strings.Replace(output, "%msg%", entry.Message, 1)
|
|
|
|
level := strings.ToUpper(entry.Level.String())
|
|
if f.LevelPad != 0 {
|
|
level = padRight(level, " ", f.LevelPad)
|
|
}
|
|
output = strings.Replace(output, "%lvl%", level, 1)
|
|
|
|
for k, v := range entry.Data {
|
|
if s, ok := v.(string); ok {
|
|
output = strings.Replace(output, "%"+k+"%", s, 1)
|
|
}
|
|
}
|
|
|
|
return []byte(output), nil
|
|
}
|