func zipEntries(readers map[string]entryReader, out *zip.Writer) error { defer trace.End(trace.Begin("")) defer out.Close() defer out.Flush() for name, r := range readers { log.Infof("Collecting log with reader %s(%#v)", name, r) e, err := r.open() if err != nil { log.Warningf("error reading %s(%s): %s\n", name, r, err) continue } sz := e.Size() header := &zip.FileHeader{ Name: name, Method: zip.Deflate, } header.SetModTime(time.Now()) header.SetMode(0644) if sz > uint32max { header.UncompressedSize = uint32max } else { header.UncompressedSize = uint32(e.Size()) } w, err := out.CreateHeader(header) if err != nil { log.Errorf("Failed to create Zip writer for %s: %s", header.Name, err) continue } log.Infof("%s has size %d", header.Name, sz) // be explicit about the number of bytes to copy as the log files will likely // be written to during this exercise _, err = io.CopyN(w, e, sz) _ = e.Close() if err != nil { log.Errorf("Failed to write content for %s: %s", header.Name, err) continue } log.Infof("Wrote %d bytes to %s", sz, header.Name) } return nil }