events_rotation.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package events_stream
  2. import (
  3. "fmt"
  4. "github.com/evilsocket/islazy/zip"
  5. "os"
  6. "time"
  7. )
  8. func (mod *EventsStream) doRotation() {
  9. if mod.output == os.Stdout {
  10. return
  11. } else if !mod.rotation.Enabled {
  12. return
  13. }
  14. output, isFile := mod.output.(*os.File)
  15. if !isFile {
  16. return
  17. }
  18. mod.rotation.Lock()
  19. defer mod.rotation.Unlock()
  20. doRotate := false
  21. if info, err := output.Stat(); err == nil {
  22. if mod.rotation.How == "size" {
  23. doRotate = float64(info.Size()) >= float64(mod.rotation.Period*1024*1024)
  24. } else if mod.rotation.How == "time" {
  25. doRotate = info.ModTime().Unix()%int64(mod.rotation.Period) == 0
  26. }
  27. }
  28. if doRotate {
  29. var err error
  30. name := fmt.Sprintf("%s-%s", mod.outputName, time.Now().Format(mod.rotation.Format))
  31. if err := output.Close(); err != nil {
  32. mod.Printf("could not close log for rotation: %s\n", err)
  33. return
  34. }
  35. if err := os.Rename(mod.outputName, name); err != nil {
  36. mod.Printf("could not rename %s to %s: %s\n", mod.outputName, name, err)
  37. } else if mod.rotation.Compress {
  38. zipName := fmt.Sprintf("%s.zip", name)
  39. if err = zip.Files(zipName, []string{name}); err != nil {
  40. mod.Printf("error creating %s: %s", zipName, err)
  41. } else if err = os.Remove(name); err != nil {
  42. mod.Printf("error deleting %s: %s", name, err)
  43. }
  44. }
  45. mod.output, err = os.OpenFile(mod.outputName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
  46. if err != nil {
  47. mod.Printf("could not open %s: %s", mod.outputName, err)
  48. }
  49. }
  50. }