syslog.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //go:build !windows && !plan9
  2. package main
  3. import (
  4. "bufio"
  5. "flag"
  6. "fmt"
  7. "log"
  8. "log/syslog"
  9. "os"
  10. "strings"
  11. "time"
  12. )
  13. func main() {
  14. var ip = flag.String("ip", "localhost:514", "ip:port")
  15. var cycle = flag.Int("cycle", 1000, "repeat number")
  16. var cycleSpan = flag.Int("sleep", 1, "sleep millisecond after one cycle")
  17. var span = flag.Int("span", 1, "sleep 1 millisecond every span row")
  18. var protocol = flag.String("protocol", "udp", "udp/tcp")
  19. var incTime = flag.Int("inctime", 1, "Increase seconds")
  20. var file = flag.String("file", "", "filenamesave for save")
  21. flag.Parse()
  22. var writer *bufio.Writer
  23. if *file != "" {
  24. // 创建输出文件
  25. outputFile, err := os.Create(*file)
  26. if err != nil {
  27. log.Fatal("无法创建输出文件:", err)
  28. }
  29. defer outputFile.Close()
  30. writer = bufio.NewWriter(outputFile)
  31. defer writer.Flush() // 确保所有缓冲数据写入磁盘
  32. }
  33. filePath := os.Args[len(os.Args)-1]
  34. readFile, err := os.Open(filePath)
  35. if err != nil {
  36. log.Fatal(err)
  37. }
  38. fileScanner := bufio.NewScanner(readFile)
  39. fileScanner.Split(bufio.ScanLines)
  40. var fileLines []string
  41. for fileScanner.Scan() {
  42. fileLines = append(fileLines, fileScanner.Text())
  43. }
  44. _ = readFile.Close()
  45. /*for _, line := range fileLines {
  46. fmt.Println(line)
  47. }
  48. fmt.Println(fileLines)
  49. */
  50. sysLog, err := syslog.Dial(*protocol, *ip, syslog.LOG_WARNING|syslog.LOG_DAEMON, "demo")
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. // 11-Jul-2023 16:00:01 DNS systemd: Started Session 1370 of user root.
  55. format := "02-Jan-2006 15:04:05"
  56. total := 0
  57. loop := 0
  58. for i := 0; i < *cycle; i++ {
  59. incDuration := time.Second * time.Duration(i*(*incTime))
  60. for k, line := range fileLines {
  61. if *incTime != 0 && line != "" {
  62. fields := strings.Fields(line)
  63. if len(fields) > 2 {
  64. timeStr := fields[0] + " " + fields[1]
  65. line = strings.Join(fields[2:], " ")
  66. t, err := time.Parse(format, timeStr)
  67. if err != nil {
  68. log.Fatal(err)
  69. }
  70. t = t.Add(incDuration)
  71. line = t.Format(format) + " " + line
  72. }
  73. }
  74. if *file == "" {
  75. if err = sysLog.Emerg(line); err != nil {
  76. log.Fatal(err)
  77. }
  78. } else {
  79. // 将行内容写入输出文件(包括换行符)
  80. _, err := writer.WriteString(line + "\n")
  81. if err != nil {
  82. log.Fatal("写入文件失败:", err)
  83. }
  84. // 每处理100行刷新一次缓冲区(可选)
  85. if total%10 == 0 {
  86. writer.Flush()
  87. }
  88. }
  89. if *span > 0 && (k%*span == 0) {
  90. time.Sleep(time.Duration(*span) * time.Millisecond)
  91. }
  92. total++
  93. }
  94. loop++
  95. fmt.Printf("send %d , total %d row .\n", loop, total)
  96. if *cycleSpan > 0 {
  97. time.Sleep(time.Duration(*cycleSpan) * time.Millisecond)
  98. }
  99. }
  100. }