123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- package services
- import (
- "context"
- "fmt"
- "github.com/pkg/sftp"
- "golang.org/x/crypto/ssh"
- "hongze/hz_sync_logs/utils"
- "io"
- "log"
- "os"
- "strings"
- "time"
- )
- func SyncYesterdayLogsByCygx(cont context.Context) (err error) {
- defer func() {
- if err != nil {
- log.Printf(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "同步查研观向昨天日志失败 ErrMsg:"+err.Error())
- }
- }()
- serviceMap := make(map[string]string)
- for host, pwd := range serviceMap {
- serviceByCygx(host, pwd)
- }
- return
- }
- func serviceByCygx(host, pwd string) {
- projectNameArr := []string{
- "hongze_cygx", // 查研观向小程序
- "hongze_cygxzs", // 查研观向小助手公众号
- "hongze_mfyx_gzh", // 买方研选公众号
- "hongze_web_mfyx", // 买方研选网页版
- "hongze_mfyx", // 买方研选小程序
- "hongze_clpt", // 查研观向网页版
- }
- sshHost := host //ssh的地址和端口(测试)
- sshConfig := &ssh.ClientConfig{
- User: "root",
- Auth: []ssh.AuthMethod{
- ssh.Password(pwd),
- },
- HostKeyCallback: ssh.InsecureIgnoreHostKey(),
- ClientVersion: "",
- Timeout: 10 * time.Second,
- }
- //建立与SSH服务器的链接
- sshClient, err := ssh.Dial("tcp", sshHost, sshConfig)
- if err != nil {
- fmt.Println("ssh.Dial Err:" + err.Error())
- return
- }
- defer sshClient.Close()
- sftpClient, err := sftp.NewClient(sshClient)
- if err != nil {
- fmt.Println("sftp.NewClient Err:" + err.Error())
- return
- }
- defer sftpClient.Close()
- //获取当前目录
- cwd, err := sftpClient.Getwd()
- if err != nil {
- fmt.Println("Getwd Err:" + err.Error())
- return
- }
- fmt.Println("当前目录:" + cwd)
- //显示文件/目录详情
- fi, err := sftpClient.Lstat(cwd)
- if err != nil {
- fmt.Println("sftpClient.Lstat Err:" + err.Error())
- return
- }
- fmt.Println(fi)
- prefixDir := `/data/cygxlogs/`
- //preSaveDirPath := `/Users/roc/go/src/hongze/hz_sync_logs/test/`
- //dirCut := `/` //linux的目录分割符
- preSaveDirPath := `F:\\cygxlogs\\`
- if strings.Contains(host, "75") {
- preSaveDirPath += "75" + "\\"
- } else {
- preSaveDirPath += "55" + "\\"
- }
- dirCut := `\\` //windows的目录分割符
- yesterdayTime := time.Now().AddDate(0, 0, -1)
- logNameArr := []string{
- "apilog",
- "binlog",
- "datalog",
- "filelog",
- //"mongolog",
- }
- for _, projectName := range projectNameArr {
- for _, logFileName := range logNameArr {
- for i := 1; i < 2; i++ {
- serverFilePath := prefixDir + projectName + "/" + logFileName
- localFilePath := preSaveDirPath + projectName + "\\" + logFileName
- //下载文件
- err = syncLogByCygx(sftpClient, yesterdayTime, serverFilePath, localFilePath, dirCut, logFileName, i)
- if err != nil {
- fmt.Println(serverFilePath+"下载失败,ERR:", err)
- }
- }
- }
- }
- return
- }
- func syncLogByCygx(sftpClient *sftp.Client, dateTime time.Time, dataDirPath, saveDirPath, dirCut, logFileName string, i int) (err error) {
- fileExt := `.log`
- date := dateTime.Format(utils.FormatDate)
- //服务器的文件路径
- remoteFileName := dataDirPath + "/" + logFileName + `.` + date + "." + fmt.Sprintf("%03d", i) + fileExt
- remoteFile, err := sftpClient.Open(remoteFileName)
- if err != nil {
- if err.Error() == "file does not exist" {
- fmt.Println(remoteFileName + " file does not exist")
- err = nil
- } else {
- fmt.Println("sftpClient.Open err:" + err.Error() + " ;remoteFileName:" + remoteFileName)
- }
- return
- }
- defer remoteFile.Close()
- //本地文件路径
- saveFileName := saveDirPath + dirCut
- fmt.Println("saveFileName:" + saveFileName)
- localFileName := logFileName + `.` + date + "." + fmt.Sprintf("%03d", i) + fileExt
- if !utils.FileIsExist(saveFileName) {
- err = os.MkdirAll(saveFileName, 0766)
- if err != nil {
- fmt.Println("创建目录失败,Err:" + err.Error())
- return
- }
- }
- localFilePath := saveFileName + localFileName
- fmt.Println("remoteFileName:" + remoteFileName)
- fmt.Println("localFilePath:" + localFilePath)
- localFile, err := os.Create(localFilePath)
- if err != nil {
- fmt.Println("create file err:" + err.Error())
- return
- }
- defer localFile.Close()
- n, err := io.Copy(localFile, remoteFile)
- if err != nil {
- fmt.Println("copy err:" + err.Error())
- return
- }
- //获取远程文件大小
- remoteFileInfo, err := sftpClient.Stat(remoteFileName)
- if err != nil {
- fmt.Println("sftpClient.Stat Err:" + err.Error())
- log.Fatalln(err.Error())
- }
- log.Printf("文件下载成功[%s->%s]远程文件大小:%s,下载文件大小:%s", remoteFileName, localFilePath, formatFileSize(remoteFileInfo.Size()), formatFileSize(n))
- //删除远程目录文件
- err = sftpClient.Remove(remoteFileName)
- if err != nil {
- fmt.Println("sftpClient.Remove Err:" + err.Error())
- return
- }
- return
- }
|