sync_log.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  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 SyncYesterdayLogs(cont context.Context) (err error) {
  15. defer func() {
  16. if err != nil {
  17. //fmt.Println(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "发送消息至同花顺失败 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  18. log.Printf(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "同步昨天日志失败 ErrMsg:"+err.Error())
  19. }
  20. }()
  21. serviceMap := make(map[string]string)
  22. for host, pwd := range serviceMap {
  23. service(host, pwd)
  24. }
  25. return
  26. }
  27. func service(host, pwd string) {
  28. projectNameArr := []string{
  29. "eta_api",
  30. "eta_chart_lib",
  31. "eta_crawler",
  32. "eta_data_publish",
  33. "eta_data_push",
  34. "eta_index_lib",
  35. "eta_mobile",
  36. "eta_pub",
  37. "eta_task",
  38. "eta_forum",
  39. "eta_forum_admin",
  40. "eta_forum_hub",
  41. }
  42. sshHost := host //ssh的地址和端口(测试)
  43. sshConfig := &ssh.ClientConfig{
  44. User: "root",
  45. Auth: []ssh.AuthMethod{
  46. ssh.Password(pwd),
  47. },
  48. HostKeyCallback: ssh.InsecureIgnoreHostKey(),
  49. ClientVersion: "",
  50. Timeout: 10 * time.Second,
  51. }
  52. //建立与SSH服务器的链接
  53. sshClient, err := ssh.Dial("tcp", sshHost, sshConfig)
  54. if err != nil {
  55. fmt.Println("ssh.Dial Err:" + err.Error())
  56. return
  57. }
  58. defer sshClient.Close()
  59. sftpClient, err := sftp.NewClient(sshClient)
  60. if err != nil {
  61. fmt.Println("sftp.NewClient Err:" + err.Error())
  62. return
  63. }
  64. defer sftpClient.Close()
  65. //获取当前目录
  66. cwd, err := sftpClient.Getwd()
  67. if err != nil {
  68. fmt.Println("Getwd Err:" + err.Error())
  69. return
  70. }
  71. fmt.Println("当前目录:" + cwd)
  72. //显示文件/目录详情
  73. fi, err := sftpClient.Lstat(cwd)
  74. if err != nil {
  75. fmt.Println("sftpClient.Lstat Err:" + err.Error())
  76. return
  77. }
  78. fmt.Println(fi)
  79. prefixDir := `/data/etalogs/`
  80. //preSaveDirPath := `/Users/roc/go/src/hongze/hz_sync_logs/test/`
  81. //dirCut := `/` //linux的目录分割符
  82. preSaveDirPath := `F:\\etalogs\\`
  83. if strings.Contains(host, "75") {
  84. preSaveDirPath += "75" + "\\"
  85. } else {
  86. preSaveDirPath += "55" + "\\"
  87. }
  88. dirCut := `\\` //windows的目录分割符
  89. yesterdayTime := time.Now().AddDate(0, 0, -1)
  90. logNameArr := []string{
  91. "apilog",
  92. "binlog",
  93. "datalog",
  94. "filelog",
  95. "mongolog",
  96. }
  97. for _, projectName := range projectNameArr {
  98. for _, logFileName := range logNameArr {
  99. for i := 1; i < 2; i++ {
  100. serverFilePath := prefixDir + projectName + "/" + logFileName
  101. localFilePath := preSaveDirPath + projectName + "\\" + logFileName
  102. //下载文件
  103. err = syncLog(sftpClient, yesterdayTime, serverFilePath, localFilePath, dirCut, logFileName, i)
  104. if err != nil {
  105. fmt.Println(serverFilePath+"下载失败,ERR:", err)
  106. }
  107. }
  108. }
  109. }
  110. return
  111. }
  112. func syncLog(sftpClient *sftp.Client, dateTime time.Time, dataDirPath, saveDirPath, dirCut, logFileName string, i int) (err error) {
  113. fileExt := `.log`
  114. date := dateTime.Format(utils.FormatDate)
  115. //服务器的文件路径
  116. remoteFileName := dataDirPath + "/" + logFileName + `.` + date + "." + fmt.Sprintf("%03d", i) + fileExt
  117. remoteFile, err := sftpClient.Open(remoteFileName)
  118. if err != nil {
  119. if err.Error() == "file does not exist" {
  120. fmt.Println(remoteFileName + " file does not exist")
  121. err = nil
  122. } else {
  123. fmt.Println("sftpClient.Open err:" + err.Error() + " ;remoteFileName:" + remoteFileName)
  124. }
  125. return
  126. }
  127. defer remoteFile.Close()
  128. //本地文件路径
  129. saveFileName := saveDirPath + dirCut
  130. fmt.Println("saveFileName:" + saveFileName)
  131. localFileName := logFileName + `.` + date + "." + fmt.Sprintf("%03d", i) + fileExt
  132. if !utils.FileIsExist(saveFileName) {
  133. err = os.MkdirAll(saveFileName, 0766)
  134. if err != nil {
  135. fmt.Println("创建目录失败,Err:" + err.Error())
  136. return
  137. }
  138. }
  139. localFilePath := saveFileName + localFileName
  140. fmt.Println("remoteFileName:" + remoteFileName)
  141. fmt.Println("localFilePath:" + localFilePath)
  142. localFile, err := os.Create(localFilePath)
  143. if err != nil {
  144. fmt.Println("create file err:" + err.Error())
  145. return
  146. }
  147. defer localFile.Close()
  148. n, err := io.Copy(localFile, remoteFile)
  149. if err != nil {
  150. fmt.Println("copy err:" + err.Error())
  151. return
  152. }
  153. //获取远程文件大小
  154. remoteFileInfo, err := sftpClient.Stat(remoteFileName)
  155. if err != nil {
  156. fmt.Println("sftpClient.Stat Err:" + err.Error())
  157. log.Fatalln(err.Error())
  158. }
  159. log.Printf("文件下载成功[%s->%s]远程文件大小:%s,下载文件大小:%s", remoteFileName, localFilePath, formatFileSize(remoteFileInfo.Size()), formatFileSize(n))
  160. //删除远程目录文件
  161. err = sftpClient.Remove(remoteFileName)
  162. if err != nil {
  163. fmt.Println("sftpClient.Remove Err:" + err.Error())
  164. return
  165. }
  166. return
  167. }
  168. //func SyncHistoryLogs() {
  169. // projectNameArr := []string{
  170. // "equity_admin",
  171. // "hongze_admin",
  172. // "hongze_advisory",
  173. // "hongze_api",
  174. // "hongze_cygx",
  175. // "hongze_mobile_admin",
  176. // "hongze_open_api",
  177. // }
  178. // sshHost := `` //ssh的地址和端口(测试)
  179. // pwd := `` //ssh密码(测试)
  180. //
  181. // sshConfig := &ssh.ClientConfig{
  182. // User: "root",
  183. // Auth: []ssh.AuthMethod{
  184. // ssh.Password(pwd),
  185. // },
  186. // HostKeyCallback: ssh.InsecureIgnoreHostKey(),
  187. // ClientVersion: "",
  188. // Timeout: 10 * time.Second,
  189. // }
  190. //
  191. // //建立与SSH服务器的链接
  192. // sshClient, err := ssh.Dial("tcp", sshHost, sshConfig)
  193. // if err != nil {
  194. // fmt.Println("ssh.Dial Err:" + err.Error())
  195. // return
  196. // }
  197. // defer sshClient.Close()
  198. // sftpClient, err := sftp.NewClient(sshClient)
  199. // if err != nil {
  200. // fmt.Println("sftp.NewClient Err:" + err.Error())
  201. // return
  202. // }
  203. // defer sftpClient.Close()
  204. // //获取当前目录
  205. // cwd, err := sftpClient.Getwd()
  206. // if err != nil {
  207. // fmt.Println("Getwd Err:" + err.Error())
  208. // return
  209. // }
  210. // fmt.Println("当前目录:" + cwd)
  211. //
  212. // //显示文件/目录详情
  213. // fi, err := sftpClient.Lstat(cwd)
  214. // if err != nil {
  215. // fmt.Println("sftpClient.Lstat Err:" + err.Error())
  216. // return
  217. // }
  218. // fmt.Println(fi)
  219. // prefixDir := `/data/rdlucklog/`
  220. // //preSaveDirPath := `/Users/roc/go/src/hongze/hz_sync_logs/test/`
  221. // //dirCut := `/` //linux的目录分割符
  222. // preSaveDirPath := `E:\\hongze_logs\\`
  223. // dirCut := `\\` //windows的目录分割符
  224. //
  225. // yesterdayTime := time.Now().AddDate(0, 0, -1)
  226. //
  227. // for _, projectName := range projectNameArr {
  228. // serverFilePath := prefixDir + projectName
  229. // localFilePath := preSaveDirPath + projectName
  230. // //下载文件
  231. // for i := 0; i < 22; i++ {
  232. // dateTime := yesterdayTime.AddDate(0, 0, -i)
  233. // err = syncLog(sftpClient, dateTime, serverFilePath, localFilePath, dirCut)
  234. // if err != nil {
  235. // fmt.Println(serverFilePath+"下载失败,ERR:", err)
  236. // }
  237. // }
  238. //
  239. // }
  240. //
  241. // return
  242. // {
  243. // dataDirPath := `/data/rdlucklog`
  244. // saveDirPath := `E:\\log\\`
  245. // fileExt := `.api.log`
  246. //
  247. // logPath := time.Now().AddDate(0, -1, 0).Format("200601")
  248. // dateObj, _ := time.Parse("2006-01-02", "2021-10-01")
  249. // for _, proName := range projectNameArr {
  250. // for i := 0; i < 31; i++ {
  251. // date := dateObj.AddDate(0, 0, i).Format("20060102")
  252. // remoteDirName := dataDirPath + `/` + proName + `/` + logPath + `/` + date + fileExt
  253. // remoteFile, err := sftpClient.Open(remoteDirName)
  254. // if err != nil {
  255. // fmt.Println("sftpClient.Open err:" + err.Error() + " ;remoteDirName:" + remoteDirName)
  256. // if err.Error() == "file does not exist" {
  257. // continue
  258. // } else {
  259. // fmt.Println("sftpClient.Open err:" + err.Error() + " ;remoteDirName:" + remoteDirName)
  260. // return
  261. // }
  262. // }
  263. // defer remoteFile.Close()
  264. // saveFileName := saveDirPath + proName + `\\202110\\`
  265. // localFileName := date + fileExt
  266. // fmt.Println("saveFileName:", saveFileName)
  267. // if !utils.FileIsExist(saveFileName) {
  268. // err = os.MkdirAll(saveFileName, 777)
  269. // if err != nil {
  270. // fmt.Println("创建目录失败,Err:" + err.Error())
  271. // return
  272. // }
  273. // }
  274. // localFilePath := saveFileName + localFileName
  275. // fmt.Println("localFilePath:" + localFilePath)
  276. // localFile, err := os.Create(localFilePath)
  277. // if err != nil {
  278. // fmt.Println("create file err:" + err.Error())
  279. // return
  280. // }
  281. // defer localFile.Close()
  282. // n, err := io.Copy(localFile, remoteFile)
  283. // if err != nil {
  284. // fmt.Println("copy err:" + err.Error())
  285. // return
  286. // }
  287. // //获取远程文件大小
  288. // remoteFileInfo, err := sftpClient.Stat(remoteDirName)
  289. // if err != nil {
  290. // fmt.Println("sftpClient.Stat Err:" + err.Error())
  291. // log.Fatalln(err.Error())
  292. // }
  293. // log.Printf("文件下载成功[%s->%s]远程文件大小:%s,下载文件大小:%s", remoteDirName, localFileName, formatFileSize(remoteFileInfo.Size()), formatFileSize(n))
  294. // //删除远程目录文件
  295. // //err = sftpClient.Remove(remoteDirName)
  296. // //if err != nil {
  297. // // fmt.Println("sftpClient.Remove Err:" + err.Error())
  298. // // return
  299. // //}
  300. // }
  301. // }
  302. // }
  303. //}
  304. func SyncLogs2() {
  305. projectNameArr := []string{
  306. "equity_admin",
  307. //"hongze_admin",
  308. //"hongze_api",
  309. //"hongze_cygx",
  310. }
  311. sshConfig := &ssh.ClientConfig{
  312. User: "root",
  313. Auth: []ssh.AuthMethod{
  314. ssh.Password("pwd"),
  315. },
  316. HostKeyCallback: ssh.InsecureIgnoreHostKey(),
  317. ClientVersion: "",
  318. Timeout: 10 * time.Second,
  319. }
  320. //建立与SSH服务器的链接
  321. sshClient, err := ssh.Dial("tcp", "ip:port", sshConfig)
  322. if err != nil {
  323. fmt.Println("ssh.Dial Err:" + err.Error())
  324. return
  325. }
  326. defer sshClient.Close()
  327. sftpClient, err := sftp.NewClient(sshClient)
  328. if err != nil {
  329. fmt.Println("sftp.NewClient Err:" + err.Error())
  330. return
  331. }
  332. defer sftpClient.Close()
  333. //获取当前目录
  334. cwd, err := sftpClient.Getwd()
  335. if err != nil {
  336. fmt.Println("Getwd Err:" + err.Error())
  337. return
  338. }
  339. fmt.Println("当前目录:" + cwd)
  340. //显示文件/目录详情
  341. fi, err := sftpClient.Lstat(cwd)
  342. if err != nil {
  343. fmt.Println("sftpClient.Lstat Err:" + err.Error())
  344. return
  345. }
  346. fmt.Println(fi)
  347. //下载文件
  348. {
  349. dataDirPath := `/data/rdlucklog`
  350. saveDirPath := `E:\\log\\`
  351. fileExt := `.api.log`
  352. logPath := time.Now().AddDate(0, -1, 0).Format("200601")
  353. dateObj, _ := time.Parse("2006-01-02", "2021-10-01")
  354. for _, proName := range projectNameArr {
  355. for i := 0; i < 31; i++ {
  356. date := dateObj.AddDate(0, 0, i).Format("20060102")
  357. remoteDirName := dataDirPath + `/` + proName + `/` + logPath + `/` + date + fileExt
  358. remoteFile, err := sftpClient.Open(remoteDirName)
  359. if err != nil {
  360. fmt.Println("sftpClient.Open err:" + err.Error() + " ;remoteDirName:" + remoteDirName)
  361. if err.Error() == "file does not exist" {
  362. continue
  363. } else {
  364. fmt.Println("sftpClient.Open err:" + err.Error() + " ;remoteDirName:" + remoteDirName)
  365. return
  366. }
  367. }
  368. defer remoteFile.Close()
  369. saveFileName := saveDirPath + proName + `\\202110\\`
  370. localFileName := date + fileExt
  371. fmt.Println("saveFileName:", saveFileName)
  372. if !utils.FileIsExist(saveFileName) {
  373. err = os.MkdirAll(saveFileName, 777)
  374. if err != nil {
  375. fmt.Println("创建目录失败,Err:" + err.Error())
  376. return
  377. }
  378. }
  379. localFilePath := saveFileName + localFileName
  380. fmt.Println("localFilePath:" + localFilePath)
  381. localFile, err := os.Create(localFilePath)
  382. if err != nil {
  383. fmt.Println("create file err:" + err.Error())
  384. return
  385. }
  386. defer localFile.Close()
  387. n, err := io.Copy(localFile, remoteFile)
  388. if err != nil {
  389. fmt.Println("copy err:" + err.Error())
  390. return
  391. }
  392. //获取远程文件大小
  393. remoteFileInfo, err := sftpClient.Stat(remoteDirName)
  394. if err != nil {
  395. fmt.Println("sftpClient.Stat Err:" + err.Error())
  396. log.Fatalln(err.Error())
  397. }
  398. log.Printf("文件下载成功[%s->%s]远程文件大小:%s,下载文件大小:%s", remoteDirName, localFileName, formatFileSize(remoteFileInfo.Size()), formatFileSize(n))
  399. //删除远程目录文件
  400. //err = sftpClient.Remove(remoteDirName)
  401. //if err != nil {
  402. // fmt.Println("sftpClient.Remove Err:" + err.Error())
  403. // return
  404. //}
  405. }
  406. }
  407. }
  408. }
  409. // 字节的单位转换 保留两位小数
  410. func formatFileSize(s int64) (size string) {
  411. if s < 1024 {
  412. return fmt.Sprintf("%.2fB", float64(s)/float64(1))
  413. } else if s < (1024 * 1024) {
  414. return fmt.Sprintf("%.2fKB", float64(s)/float64(1024))
  415. } else if s < (1024 * 1024 * 1024) {
  416. return fmt.Sprintf("%.2fMB", float64(s)/float64(1024*1024))
  417. } else if s < (1024 * 1024 * 1024 * 1024) {
  418. return fmt.Sprintf("%.2fGB", float64(s)/float64(1024*1024*1024))
  419. } else if s < (1024 * 1024 * 1024 * 1024 * 1024) {
  420. return fmt.Sprintf("%.2fTB", float64(s)/float64(1024*1024*1024*1024))
  421. } else { //if s < (1024 * 1024 * 1024 * 1024 * 1024 * 1024)
  422. return fmt.Sprintf("%.2fEB", float64(s)/float64(1024*1024*1024*1024*1024))
  423. }
  424. }