因为平时管理的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) }
以上所述就是本文的全部内容了,希望大家能够喜欢。
本文向大家介绍Go语言实现自动填写古诗词实例代码,包括了Go语言实现自动填写古诗词实例代码的使用技巧和注意事项,需要的朋友参考一下 前言 “白日依山尽,___”。下句自然填黄河入海流,那么“日月忽其不淹兮,___,___,恐美人之迟暮”,中间两句怎么填呢? 最近工作中有个需求,就是1500道语文诗词填空题没有答案,现在需要给这些题目大爷们匹配它们对应的答案,好在题目信息都很完整,指出了诗词出处、作
问题内容: 我想编写一个脚本将文件上传到FTP。 登录系统将如何工作?我正在寻找这样的东西: 以及任何其他登录凭据。 问题答案: 使用,您可以这样编写: 如果FTP主机需要TLS,请改用。 要检索它,可以使用: 编辑 : 要查找当前目录,请使用: FTP.pwd():返回服务器上当前目录的路径名。 要更改目录,请使用: FTP.cwd(pathname):设置服务器上的当前目录。
本文向大家介绍Go语言实现简单Web服务器的方法,包括了Go语言实现简单Web服务器的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言实现简单Web服务器的方法。分享给大家供大家参考。具体分析如下: 包 http 通过任何实现了 http.Handler 的值来响应 HTTP 请求: package http type Handler interface { ServeHTTP
本文向大家介绍Go语言实现的一个简单Web服务器,包括了Go语言实现的一个简单Web服务器的使用技巧和注意事项,需要的朋友参考一下 Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由,静态文件,模版,cookie等数据进行设置和操作。 http包建立Web服务器 上
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 Golang标准库。对于程序员而言,标准库与语言本身同样重要,它好比一个百宝箱,能为各种常见的任务提供完美的解决方案。以示例驱动的方式讲解Golang的标准库。 标准库基于最新版本Go。注:目前 Go 标准库文档并没有标识某个 API 基于哪个版本的 Go,将来会加上这部分 issue。 讲解中涉及到特定操作系统时,针对的都是
主要内容:通道的特性,声明通道类型,创建通道,使用通道发送数据,使用通道接收数据如果说 goroutine 是 Go语言程序的并发体的话,那么 channels 就是它们之间的通信机制。一个 channels 是一个通信机制,它可以让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个特殊的类型,也就是 channels 可发送数据的类型。一个可以发送 int 类型数据的 channel 一般写为 chan int。 Go语