cygx_log.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package services
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/pkg/sftp"
  6. "golang.org/x/crypto/ssh"
  7. "hongze/hz_sync_logs/utils"
  8. "io"
  9. "log"
  10. "os"
  11. "strings"
  12. "time"
  13. )
  14. func SyncYesterdayLogsByCygx(cont context.Context) (err error) {
  15. defer func() {
  16. if err != nil {
  17. log.Printf(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "同步查研观向昨天日志失败 ErrMsg:"+err.Error())
  18. }
  19. }()
  20. serviceMap := make(map[string]string)
  21. for host, pwd := range serviceMap {
  22. serviceByCygx(host, pwd)
  23. }
  24. return
  25. }
  26. func serviceByCygx(host, pwd string) {
  27. projectNameArr := []string{
  28. "hongze_cygx", // 查研观向小程序
  29. "hongze_cygxzs", // 查研观向小助手公众号
  30. "hongze_mfyx_gzh", // 买方研选公众号
  31. "hongze_web_mfyx", // 买方研选网页版
  32. "hongze_mfyx", // 买方研选小程序
  33. "hongze_clpt", // 查研观向网页版
  34. }
  35. sshHost := host //ssh的地址和端口(测试)
  36. sshConfig := &ssh.ClientConfig{
  37. User: "root",
  38. Auth: []ssh.AuthMethod{
  39. ssh.Password(pwd),
  40. },
  41. HostKeyCallback: ssh.InsecureIgnoreHostKey(),
  42. ClientVersion: "",
  43. Timeout: 10 * time.Second,
  44. }
  45. //建立与SSH服务器的链接
  46. sshClient, err := ssh.Dial("tcp", sshHost, sshConfig)
  47. if err != nil {
  48. fmt.Println("ssh.Dial Err:" + err.Error())
  49. return
  50. }
  51. defer sshClient.Close()
  52. sftpClient, err := sftp.NewClient(sshClient)
  53. if err != nil {
  54. fmt.Println("sftp.NewClient Err:" + err.Error())
  55. return
  56. }
  57. defer sftpClient.Close()
  58. //获取当前目录
  59. cwd, err := sftpClient.Getwd()
  60. if err != nil {
  61. fmt.Println("Getwd Err:" + err.Error())
  62. return
  63. }
  64. fmt.Println("当前目录:" + cwd)
  65. //显示文件/目录详情
  66. fi, err := sftpClient.Lstat(cwd)
  67. if err != nil {
  68. fmt.Println("sftpClient.Lstat Err:" + err.Error())
  69. return
  70. }
  71. fmt.Println(fi)
  72. prefixDir := `/data/cygxlogs/`
  73. //preSaveDirPath := `/Users/roc/go/src/hongze/hz_sync_logs/test/`
  74. //dirCut := `/` //linux的目录分割符
  75. preSaveDirPath := `F:\\cygxlogs\\`
  76. if strings.Contains(host, "75") {
  77. preSaveDirPath += "75" + "\\"
  78. } else {
  79. preSaveDirPath += "55" + "\\"
  80. }
  81. dirCut := `\\` //windows的目录分割符
  82. yesterdayTime := time.Now().AddDate(0, 0, -1)
  83. logNameArr := []string{
  84. "apilog",
  85. "binlog",
  86. "datalog",
  87. "filelog",
  88. //"mongolog",
  89. }
  90. for _, projectName := range projectNameArr {
  91. for _, logFileName := range logNameArr {
  92. for i := 1; i < 2; i++ {
  93. serverFilePath := prefixDir + projectName + "/" + logFileName
  94. localFilePath := preSaveDirPath + projectName + "\\" + logFileName
  95. //下载文件
  96. err = syncLogByCygx(sftpClient, yesterdayTime, serverFilePath, localFilePath, dirCut, logFileName, i)
  97. if err != nil {
  98. fmt.Println(serverFilePath+"下载失败,ERR:", err)
  99. }
  100. }
  101. }
  102. }
  103. return
  104. }
  105. func syncLogByCygx(sftpClient *sftp.Client, dateTime time.Time, dataDirPath, saveDirPath, dirCut, logFileName string, i int) (err error) {
  106. fileExt := `.log`
  107. date := dateTime.Format(utils.FormatDate)
  108. //服务器的文件路径
  109. remoteFileName := dataDirPath + "/" + logFileName + `.` + date + "." + fmt.Sprintf("%03d", i) + fileExt
  110. remoteFile, err := sftpClient.Open(remoteFileName)
  111. if err != nil {
  112. if err.Error() == "file does not exist" {
  113. fmt.Println(remoteFileName + " file does not exist")
  114. err = nil
  115. } else {
  116. fmt.Println("sftpClient.Open err:" + err.Error() + " ;remoteFileName:" + remoteFileName)
  117. }
  118. return
  119. }
  120. defer remoteFile.Close()
  121. //本地文件路径
  122. saveFileName := saveDirPath + dirCut
  123. fmt.Println("saveFileName:" + saveFileName)
  124. localFileName := logFileName + `.` + date + "." + fmt.Sprintf("%03d", i) + fileExt
  125. if !utils.FileIsExist(saveFileName) {
  126. err = os.MkdirAll(saveFileName, 0766)
  127. if err != nil {
  128. fmt.Println("创建目录失败,Err:" + err.Error())
  129. return
  130. }
  131. }
  132. localFilePath := saveFileName + localFileName
  133. fmt.Println("remoteFileName:" + remoteFileName)
  134. fmt.Println("localFilePath:" + localFilePath)
  135. localFile, err := os.Create(localFilePath)
  136. if err != nil {
  137. fmt.Println("create file err:" + err.Error())
  138. return
  139. }
  140. defer localFile.Close()
  141. n, err := io.Copy(localFile, remoteFile)
  142. if err != nil {
  143. fmt.Println("copy err:" + err.Error())
  144. return
  145. }
  146. //获取远程文件大小
  147. remoteFileInfo, err := sftpClient.Stat(remoteFileName)
  148. if err != nil {
  149. fmt.Println("sftpClient.Stat Err:" + err.Error())
  150. log.Fatalln(err.Error())
  151. }
  152. log.Printf("文件下载成功[%s->%s]远程文件大小:%s,下载文件大小:%s", remoteFileName, localFilePath, formatFileSize(remoteFileInfo.Size()), formatFileSize(n))
  153. //删除远程目录文件
  154. err = sftpClient.Remove(remoteFileName)
  155. if err != nil {
  156. fmt.Println("sftpClient.Remove Err:" + err.Error())
  157. return
  158. }
  159. return
  160. }