首页 > 编程 > Golang > 正文

go语言实现通过FTP库自动上传web日志

2020-04-01 19:15:15
字体:
来源:转载
供稿:网友

这篇文章主要介绍了go语言实现通过FTP库自动上传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,

 

 
  1. // uploadlog 
  2. /* 
  3. 1.本程序主要是实现linux下上传web日志使用, 
  4. 2.使用方法是 uploadlog logfile_dir 
  5. 程序只上传当前时间点的日志文件, 
  6. */ 
  7. package main 
  8. import ( 
  9. "fmt" 
  10. ftp "github.com/jlaffaye/ftp" 
  11. "log" 
  12. "net" 
  13. "os" 
  14. "path/filepath" 
  15. "strconv" 
  16. "strings" 
  17. "time" 
  18. func main() { 
  19. fmt.Println("Hello World!"
  20. if len(os.Args) != 2 { 
  21. log.Fatal("Usage:" + filepath.Base(os.Args[0]) + " log_dir "
  22. os.Exit(1) 
  23. //logFileName是将要分析的日志 
  24. logFileName, _, _ := getLogFileName() 
  25. serverIp := getLocalIpAddr() 
  26. //serverName, _ := os.Hostname() 
  27. time.Sleep(time.Duration(90) * time.Second) 
  28. dir := os.Args[1] 
  29. filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { 
  30. if f == nil { 
  31. return err 
  32. if f.IsDir() { 
  33. return nil 
  34. if f.Name() == logFileName { 
  35. fmt.Println(path) 
  36. //pathFields的作用是将日志path解析成一个数据,从而可以得到日志的域名,注意,如果是linux系统,要用“/” 
  37. pathFields := strings.Split(path, "/"
  38. var domainName string 
  39. if len(pathFields) > 3 { 
  40. domainName = pathFields[len(pathFields)-3] 
  41. fmt.Println(time.Now()) 
  42. ftpUploadFile("ftp-server-ip:21""logftpuser""ftp-password", path, domainName, serverIp+"_"+logFileName) 
  43. fmt.Println(time.Now()) 
  44. return nil 
  45. }) 
  46. func getLogFileName() (string, string, string) { 
  47. MonthTOstr := map[string]string{"January""01"
  48. "February""02"
  49. "March""03"
  50. "April""04"
  51. "May""05"
  52. "June""06"
  53. "July""07"
  54. "August""08"
  55. "September""09"
  56. "October""10"
  57. "November""11"
  58. "December""12"
  59. timenow := time.Now() 
  60. year, month, day := timenow.Date() 
  61. //monthStr := month.String() 
  62. hour, _, _ := timenow.Clock() 
  63. yearStr := strings.TrimLeft(strconv.Itoa(year), "20"//去掉前面的四位数年份如"2014"年的“20” 
  64. dayStr, hourStr := strconv.Itoa(day), strconv.Itoa(hour) 
  65. if day < 10 { 
  66. dayStr = "0" + dayStr 
  67. if hour < 10 { 
  68. hourStr = "0" + hourStr 
  69. fileName := "ex" + yearStr + MonthTOstr[month.String()] + dayStr + hourStr + ".log" 
  70. logDay := yearStr + MonthTOstr[month.String()] + dayStr 
  71. logMonth := yearStr + MonthTOstr[month.String()] 
  72. //monthSrt := strconv.Itoa(timenow.Month()) 
  73. //fmt.Println(fileName, logDay) 
  74. return fileName, logDay, logMonth 
  75. //fmt.Println(fileName) 
  76. func getLocalIpAddr() string { 
  77. //这里使用一个合法的IP就行了,端口随便,即使没有打开也行,也许因为使用UDP,如果用TCP的话,对端不打开就会有问题 
  78. conn, err := net.Dial("udp""192.168.8.51:80"
  79. if err != nil { 
  80. //fmt.Println(err.Error()) 
  81. return "127.0.0.1" 
  82. defer conn.Close() 
  83. //fmt.Println(conn.LocalAddr().String()) 
  84. //conn. 
  85. //fmt.Println(strings.Split(conn.LocalAddr().String(), ":")[0]) 
  86. return strings.Split(conn.LocalAddr().String(), ":")[0] 
  87. func ftpUploadFile(ftpserver, ftpuser, pw, localFile, remoteSavePath, saveName string) { 
  88. ftp, err := ftp.Connect(ftpserver) 
  89. if err != nil { 
  90. fmt.Println(err) 
  91. err = ftp.Login(ftpuser, pw) 
  92. if err != nil { 
  93. fmt.Println(err) 
  94. //注意是 pub/log,不能带“/”开头 
  95. ftp.ChangeDir("pub/log"
  96. dir, err := ftp.CurrentDir() 
  97. fmt.Println(dir) 
  98. ftp.MakeDir(remoteSavePath) 
  99. ftp.ChangeDir(remoteSavePath) 
  100. dir, _ = ftp.CurrentDir() 
  101. fmt.Println(dir) 
  102. file, err := os.Open(localFile) 
  103. if err != nil { 
  104. fmt.Println(err) 
  105. defer file.Close() 
  106. err = ftp.Stor(saveName, file) 
  107. if err != nil { 
  108. fmt.Println(err) 
  109. ftp.Logout() 
  110. ftp.Quit() 
  111. fmt.Println("success upload file:", localFile) 

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表