func (c *CSVPump) WriteData(data []interface{}) error { curtime := time.Now() fname := fmt.Sprintf("%d-%s-%d-%d.csv", curtime.Year(), curtime.Month().String(), curtime.Day(), curtime.Hour()) fname = path.Join(c.csvConf.CSVDir, fname) var outfile *os.File var appendHeader bool if _, err := os.Stat(fname); os.IsNotExist(err) { var createErr error outfile, createErr = os.Create(fname) if createErr != nil { log.WithFields(logrus.Fields{ "prefix": csvPrefix, }).Error("Failed to create new CSV file: ", createErr) } appendHeader = true } else { var appendErr error outfile, appendErr = os.OpenFile(fname, os.O_APPEND|os.O_WRONLY, 0600) if appendErr != nil { log.WithFields(logrus.Fields{ "prefix": csvPrefix, }).Error("Failed to open CSV file: ", appendErr) } } defer outfile.Close() writer := csv.NewWriter(outfile) if appendHeader { startRecord := analytics.AnalyticsRecord{} var headers = startRecord.GetFieldNames() err := writer.Write(headers) if err != nil { log.WithFields(logrus.Fields{ "prefix": csvPrefix, }).Error("Failed to write file headers: ", err) return err } } for _, v := range data { decoded := v.(analytics.AnalyticsRecord) toWrite := decoded.GetLineValues() // toWrite := []string{ // decoded.Method, // decoded.Path, // strconv.FormatInt(decoded.ContentLength, 10), // decoded.UserAgent, // strconv.Itoa(decoded.Day), // decoded.Month.String(), // strconv.Itoa(decoded.Year), // strconv.Itoa(decoded.Hour), // strconv.Itoa(decoded.ResponseCode), // decoded.APIName, // decoded.APIVersion} err := writer.Write(toWrite) if err != nil { log.Error("File write failed!") log.Error(err) } } writer.Flush() return nil }