因为平时管理的web服务器都是VM服务器,为节省硬盘空间,一般给虚拟机分配的硬盘空间都比较小,只有8 g,因为,保存不了多少日志,所以每天都需要把每台网络日志转移到一个硬盘比较大的服务器上,然后再使用NBU集中备份,本程序主要使用去语言实现实现将web日志通过FTP自动上传FTP服务器,使用了filepath.Walk遍历日志目录及第三方纯去库"github.com/jlaffaye/ftp”,而日志VM本地存储路径格式是/var/log/weblog/www.domainName.com/month/20140616.access.log,
//uploadlog/* 1 .本程序主要是实现linux下上传网络日志使用, 2.使用方法是uploadlog logfile_dir 程序只上传当前时间点的日志文件, */主要包 导入( “fmt” ftp "github.com/jlaffaye/ftp” “日志” “净” “操作系统” “路径/filepath” “strconv” “弦” “时间” ) 函数main () { fmt。Println (“Hello World !”) 如果len (os.Args) !=2 { 日志。致命的(“用法:”+ 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。走(dir, func(路径字符串,f操作系统。FileInfo,都会犯错误错误){ 如果f==nil { 返回错 } 如果f.IsDir () { 返回nil } 如果f.Name ()==logFileName { fmt.Println(路径)//pathFields的作用是将日志路径解析成一个数据,从而可以得到日志的域名,注意,如果是linux系统,要用“/? pathFields:=字符串。Split(路径,“\”) var域名字符串 如果len (pathFields)比;3 { 域名=pathFields (len (pathFields) 3) } fmt.Println (time.Now ()) ftpUploadFile (“ftp-server-ip: 21”、“logftpuser”,“ftp-password”路径,域名,serverIp +“_”+ logFileName) fmt.Println (time.Now ()) } 返回nil }) } func getLogFileName()(字符串,字符串,字符串){ MonthTOstr:=map [string]字符串{“1”:“1”, “2”:“02”, “3”:“03”, “四月”:“04”, “可能”:“05”, “6月”:“06”, “7”:“7”, “八月”:“08”, “九月”:“09”, “十月”:“10”, :“11月11日”, :“12月12 "} timenow:=time.Now () 年、月、日:=timenow.Date ()//monthStr:=month.String () 小时,_,_:=timenow.Clock () yearStr:=strings.TrimLeft (strconv.Itoa(年),“20”)//去掉前面的四位数年份如“2014”年的“20” dayStr hourStr:=strconv.Itoa(天),strconv.Itoa(小时) 如果一天& lt;10 { dayStr=" 0 " + dayStr } 如果小时& lt;10 { hourStr=" 0 " + hourStr } 文件名:=扒芭选? 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(文件名,logDay) 返回文件名,logDay logMonth//fmt.Println(文件名) } 字符串函数getLocalIpAddr () {//这里使用一个合法的IP就行了,端口随便,即使没有打开也行,也许因为使用UDP,如果用TCP的话,对端不打开就会有问题 康涅狄格州,犯错:=净。刻度盘(“udp”、“192.168.8.51:80”) 如果犯错!=nil {//fmt.Println (err.Error ()) 返回“127.0.0.1” } 推迟conn.Close ()//fmt.Println (conn.LocalAddr () .String ())//?/fmt.Println (strings.Split (conn.LocalAddr () .String (),“:”) [0]) .String返回strings.Split (conn.LocalAddr () (),“:”) [0] } func ftpUploadFile (ftpserver ftpuser、pw localFile, remoteSavePath, saveName字符串){ ftp,犯错:=ftp.Connect (ftpserver) 如果犯错!=nil { fmt.Println (err) } 呃=ftp。登录(ftpuser pw) 如果犯错!=nil { fmt.Println (err) }//注意是pub/日志,不能带“/笨耐? ftp.ChangeDir (pub/日志) dir,犯错:=ftp.CurrentDir () fmt.Println (dir) ftp.MakeDir (remoteSavePath) ftp.ChangeDir (remoteSavePath) dir, _=ftp.CurrentDir () fmt.Println (dir) 文件,犯错:=os.Open (localFile) 如果犯错!=nil { fmt.Println (err) } 推迟file.Close () 呃=ftp。大的(saveName文件) 如果犯错!=nil { fmt.Println (err) } ftp.Logout () ftp.Quit () fmt。Println(“成功上传文件:”,localFile) }去语言实现通过FTP库自动上web日传志