go语言实现通过FTP库自动上传web日志
程序员文章站
2022-05-15 08:18:02
因为平时管理的web服务器都是vm服务器,为节省硬盘空间,一般给虚拟机分配的硬盘空间都比较小,只有8g,因为,保存不了多少日志,所以每天都需要把每台web日志转移到一个硬盘...
因为平时管理的web服务器都是vm服务器,为节省硬盘空间,一般给虚拟机分配的硬盘空间都比较小,只有8g,因为,保存不了多少日志,所以每天都需要把每台web日志转移到一个硬盘比较大的服务器上,然后再使用nbu集中备份,本程序主要使用go语言实现实现将web日志通过ftp自动上传ftp服务器,使用了filepath.walk遍历日志目录及第三方纯go库“github.com/jlaffaye/ftp”,而日志vm本地存储路径格式是 /var/log/weblog/www.domainname.com/month/20140616.access.log,
// uploadlog /* 1.本程序主要是实现linux下上传web日志使用, 2.使用方法是 uploadlog logfile_dir 程序只上传当前时间点的日志文件, */ package main import ( "fmt" ftp "github.com/jlaffaye/ftp" "log" "net" "os" "path/filepath" "strconv" "strings" "time" ) func main() { fmt.println("hello world!") if len(os.args) != 2 { log.fatal("usage:" + filepath.base(os.args[0]) + " log_dir ") os.exit(1) } //logfilename是将要分析的日志 logfilename, _, _ := getlogfilename() serverip := getlocalipaddr() //servername, _ := os.hostname() time.sleep(time.duration(90) * time.second) dir := os.args[1] filepath.walk(dir, func(path string, f os.fileinfo, err error) error { if f == nil { return err } if f.isdir() { return nil } if f.name() == logfilename { fmt.println(path) //pathfields的作用是将日志path解析成一个数据,从而可以得到日志的域名,注意,如果是linux系统,要用“/” pathfields := strings.split(path, "\") var domainname string if len(pathfields) > 3 { domainname = pathfields[len(pathfields)-3] } fmt.println(time.now()) ftpuploadfile("ftp-server-ip:21", "logftpuser", "ftp-password", path, domainname, serverip+"_"+logfilename) fmt.println(time.now()) } return nil }) } func getlogfilename() (string, string, string) { monthtostr := map[string]string{"january": "01", "february": "02", "march": "03", "april": "04", "may": "05", "june": "06", "july": "07", "august": "08", "september": "09", "october": "10", "november": "11", "december": "12"} timenow := time.now() year, month, day := timenow.date() //monthstr := month.string() hour, _, _ := timenow.clock() yearstr := strings.trimleft(strconv.itoa(year), "20") //去掉前面的四位数年份如"2014"年的“20” daystr, hourstr := strconv.itoa(day), strconv.itoa(hour) if day < 10 { daystr = "0" + daystr } if hour < 10 { hourstr = "0" + hourstr } filename := "ex" + yearstr + monthtostr[month.string()] + daystr + hourstr + ".log" logday := yearstr + monthtostr[month.string()] + daystr logmonth := yearstr + monthtostr[month.string()] //monthsrt := strconv.itoa(timenow.month()) //fmt.println(filename, logday) return filename, logday, logmonth //fmt.println(filename) } func getlocalipaddr() string { //这里使用一个合法的ip就行了,端口随便,即使没有打开也行,也许因为使用udp,如果用tcp的话,对端不打开就会有问题 conn, err := net.dial("udp", "192.168.8.51:80") if err != nil { //fmt.println(err.error()) return "127.0.0.1" } defer conn.close() //fmt.println(conn.localaddr().string()) //conn. //fmt.println(strings.split(conn.localaddr().string(), ":")[0]) return strings.split(conn.localaddr().string(), ":")[0] } func ftpuploadfile(ftpserver, ftpuser, pw, localfile, remotesavepath, savename string) { ftp, err := ftp.connect(ftpserver) if err != nil { fmt.println(err) } err = ftp.login(ftpuser, pw) if err != nil { fmt.println(err) } //注意是 pub/log,不能带“/”开头 ftp.changedir("pub/log") dir, err := ftp.currentdir() fmt.println(dir) ftp.makedir(remotesavepath) ftp.changedir(remotesavepath) dir, _ = ftp.currentdir() fmt.println(dir) file, err := os.open(localfile) if err != nil { fmt.println(err) } defer file.close() err = ftp.stor(savename, file) if err != nil { fmt.println(err) } ftp.logout() ftp.quit() fmt.println("success upload file:", localfile) }
以上所述就是本文的全部内容了,希望大家能够喜欢。
上一篇: Golang学习笔记(四):array、slice、map
下一篇: Go语言中的变量声明和赋值