Log-Setup

func SetupLogging(logPath string) (err error) {
    logFile, err := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600)
    if err != nil {
        return err
    }
    logOutputs := io.MultiWriter(logFile, os.Stdout)
    log.SetOutput(logOutputs)
    log.SetFlags(0)

    return
}

Nachdem diese Funktion aufgerufen wurde, werden Aufrufe von log.Println(…) sowohl auf stdout als auch in die angegebene Datei loggen.

Pretty-print struct

kann keine verschachtelten structs schön ausgeben.

func prettyPrintStruct(s interface{}) {
    v := reflect.ValueOf(s)
    t := v.Type()

    if t.Kind() != reflect.Struct {
        fmt.Println("Input is not a struct")
        return
    }

    fmt.Printf("%s:\n{\n", t.Name())
    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        value := v.Field(i)
        fmt.Printf("  %s: %v\n", field.Name, value.Interface())
    }
    fmt.Printf("}\n\n")
}