xingzai před 5 měsíci
rodič
revize
d2e5d27edd
2 změnil soubory, kde provedl 181 přidání a 0 odebrání
  1. 177 0
      services/cygx_log.go
  2. 4 0
      services/task.go

+ 177 - 0
services/cygx_log.go

@@ -0,0 +1,177 @@
+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/rdlucklog/hongze_cygx/`
+	//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
+}

+ 4 - 0
services/task.go

@@ -13,6 +13,10 @@ func Task() {
 	syncYesterdayLogs := task.NewTask("SyncYesterdayLogs", "0 0 4 * * * ", SyncYesterdayLogs)
 	task.AddTask("每日同步接口日志", syncYesterdayLogs)
 
+	// 每日同步查研观向接口日志
+	syncYesterdayLogsByCygx := task.NewTask("SyncYesterdayLogsByCygx", "0 30 4 * * * ", SyncYesterdayLogsByCygx)
+	task.AddTask("每日同步查研观向接口日志", syncYesterdayLogsByCygx)
+
 	task.StartTask()
 	fmt.Println("task end")
 }