Skip to content

Commit

Permalink
Removed the *j methods in favor of just using log.Field() everywhere
Browse files Browse the repository at this point in the history
Now all the remaining logging methods can take log.Field() anywhere (the
*f methods need to have the formatted string first)

Never liked the *j methods in the first place so this is a huge win.
  • Loading branch information
karl-gustav committed Apr 17, 2023
1 parent ab5a843 commit 3075cdf
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 61 deletions.
14 changes: 11 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,16 @@ func init() {
}
func main() {
log.Info("Hello", "world")
log.Infof("Hello %s", "world")
log.Infoj("label", log.Field("struct", struct{ Hello string }{"world"}))
log.Info("Hello", "world") // logged as "Hello world"
log.Infof("Hello %s", "world") // logged as "Hello world"
// logged as "Hello world" with a an attached json
// structure called "struct": `{"Maximum","Effort"}`
wantAsJson := struct{ Maximum string }{"Effort"}
log.Info("Hello", log.Field("struct", wantAsJson), "world")
// also works on the formated log methods (e.g. Infof(...))
// the fields are just ignored for the formated string
log.Infof("Hello %", log.Field("struct", wantAsJson), "world")
}
```
111 changes: 53 additions & 58 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@ var stdout = bufio.NewWriter(os.Stdout)

type Logger struct{}

type Field struct {
Key string
Value interface{}
}

func (l *Logger) Field(key string, field interface{}) *Field {
return &Field{key, field}
}

var prefixPath string

// StructuredLogger is used to have structured logging in stackdriver (Google Cloud Platform)
Expand All @@ -54,111 +63,86 @@ func setPrefixPath() {
}

func (l *Logger) Debug(v ...interface{}) {
l.writeLog(debug_severety, strings.TrimSpace(fmt.Sprintln(v...)))
inputs, fields := extractFields(v)
l.writeLog(debug_severety, strings.TrimSpace(fmt.Sprintln(inputs...)), fields)
}

func (l *Logger) Info(v ...interface{}) {
l.writeLog(info_severety, strings.TrimSpace(fmt.Sprintln(v...)))
inputs, fields := extractFields(v)
l.writeLog(info_severety, strings.TrimSpace(fmt.Sprintln(inputs...)), fields)
}

func (l *Logger) Notice(v ...interface{}) {
l.writeLog(notice_severety, strings.TrimSpace(fmt.Sprintln(v...)))
inputs, fields := extractFields(v)
l.writeLog(notice_severety, strings.TrimSpace(fmt.Sprintln(inputs...)), fields)
}

func (l *Logger) Warning(v ...interface{}) {
l.writeLog(warning_severety, strings.TrimSpace(fmt.Sprintln(v...)))
inputs, fields := extractFields(v)
l.writeLog(warning_severety, strings.TrimSpace(fmt.Sprintln(inputs...)), fields)
}

func (l *Logger) Error(v ...interface{}) {
l.writeLog(error_severety, strings.TrimSpace(fmt.Sprintln(v...)))
inputs, fields := extractFields(v)
l.writeLog(error_severety, strings.TrimSpace(fmt.Sprintln(inputs...)), fields)
}

func (l *Logger) Critical(v ...interface{}) {
l.writeLog(critical_severety, strings.TrimSpace(fmt.Sprintln(v...)))
inputs, fields := extractFields(v)
l.writeLog(critical_severety, strings.TrimSpace(fmt.Sprintln(inputs...)), fields)
}

func (l *Logger) Alert(v ...interface{}) {
l.writeLog(alert_severety, strings.TrimSpace(fmt.Sprintln(v...)))
inputs, fields := extractFields(v)
l.writeLog(alert_severety, strings.TrimSpace(fmt.Sprintln(inputs...)), fields)
}

func (l *Logger) Emergency(v ...interface{}) {
l.writeLog(emergency_severety, strings.TrimSpace(fmt.Sprintln(v...)))
inputs, fields := extractFields(v)
l.writeLog(emergency_severety, strings.TrimSpace(fmt.Sprintln(inputs...)), fields)
}

func (l *Logger) Debugf(format string, v ...interface{}) {
l.writeLog(debug_severety, fmt.Sprintf(format, v...))
inputs, fields := extractFields(v)
l.writeLog(debug_severety, fmt.Sprintf(format, inputs...), fields)
}

func (l *Logger) Infof(format string, v ...interface{}) {
l.writeLog(info_severety, fmt.Sprintf(format, v...))
inputs, fields := extractFields(v)
l.writeLog(info_severety, fmt.Sprintf(format, inputs...), fields)
}

func (l *Logger) Noticef(format string, v ...interface{}) {
l.writeLog(notice_severety, fmt.Sprintf(format, v...))
inputs, fields := extractFields(v)
l.writeLog(notice_severety, fmt.Sprintf(format, inputs...), fields)
}

func (l *Logger) Warningf(format string, v ...interface{}) {
l.writeLog(warning_severety, fmt.Sprintf(format, v...))
inputs, fields := extractFields(v)
l.writeLog(warning_severety, fmt.Sprintf(format, inputs...), fields)
}

func (l *Logger) Errorf(format string, v ...interface{}) {
l.writeLog(error_severety, fmt.Sprintf(format, v...))
inputs, fields := extractFields(v)
l.writeLog(error_severety, fmt.Sprintf(format, inputs...), fields)
}

func (l *Logger) Criticalf(format string, v ...interface{}) {
l.writeLog(critical_severety, fmt.Sprintf(format, v...))
inputs, fields := extractFields(v)
l.writeLog(critical_severety, fmt.Sprintf(format, inputs...), fields)
}

func (l *Logger) Alertf(format string, v ...interface{}) {
l.writeLog(alert_severety, fmt.Sprintf(format, v...))
inputs, fields := extractFields(v)
l.writeLog(alert_severety, fmt.Sprintf(format, inputs...), fields)
}

func (l *Logger) Emergencyf(format string, v ...interface{}) {
l.writeLog(emergency_severety, fmt.Sprintf(format, v...))
}

type Field struct {
Key string
Value interface{}
}

func (l *Logger) Field(key string, field interface{}) *Field {
return &Field{key, field}
}

func (l *Logger) Debugj(message string, fields ...*Field) {
l.writeLog(debug_severety, message, fields...)
inputs, fields := extractFields(v)
l.writeLog(emergency_severety, fmt.Sprintf(format, inputs...), fields)
}

func (l *Logger) Infoj(message string, fields ...*Field) {
l.writeLog(info_severety, message, fields...)
}

func (l *Logger) Noticej(message string, fields ...*Field) {
l.writeLog(notice_severety, message, fields...)
}

func (l *Logger) Warningj(message string, fields ...*Field) {
l.writeLog(warning_severety, message, fields...)
}

func (l *Logger) Errorj(message string, fields ...*Field) {
l.writeLog(error_severety, message, fields...)
}

func (l *Logger) Criticalj(message string, fields ...*Field) {
l.writeLog(critical_severety, message, fields...)
}

func (l *Logger) Alertj(message string, fields ...*Field) {
l.writeLog(alert_severety, message, fields...)
}

func (l *Logger) Emergencyj(message string, fields ...*Field) {
l.writeLog(emergency_severety, message, fields...)
}

func (l *Logger) writeLog(severety severety, message string, fields ...*Field) {
func (l *Logger) writeLog(severety severety, message string, fields []*Field) {
output := os.Stderr

var isError bool
Expand Down Expand Up @@ -248,6 +232,17 @@ func relative(path string) string {
return path
}

func extractFields(inputs []interface{}) (cleanInputs []interface{}, fields []*Field) {
for _, input := range inputs {
if field, ok := input.(*Field); ok {
fields = append(fields, field)
} else {
cleanInputs = append(cleanInputs, input)
}
}
return
}

// stackdriverLogStruct source https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
type stackdriverLogStruct struct {
Message string `json:"message"`
Expand Down

0 comments on commit 3075cdf

Please sign in to comment.