日志的转储和压缩是很是关键的,它不只能够减小硬盘空间占用,主要还能够在发生故障时根据日志定位出故障缘由。下面来看看golang和java的文件转储实现。java
go语言:golang
用到了filepath包下的Walk方法,具体说明能够参看历史文章:日志
go语言path/filepath包之Walk源码解析code
package main import ( "fmt" "os" "io" "archive/zip" "path/filepath" "time" "log" ) func main() { logFile := "D:/tmp/successLog/logs/root.log" backFile := "D:/tmp/successLog/logs/root_" + time.Now().Format("20060102150405") + ".zip" err := zipFile(logFile, backFile) if err != nil { log.Println(fmt.Sprintf("zip file %s to %s error : %v", logFile, backFile, err)) return } else { os.Remove(logFile) } //转储后建立新文件 //createFile() //修改文件权限 //os.Chmod(backfile, 0400) //删除备份文件 //deleteOldBackfiles(dir) } func zipFile(source, target string) error { zipFile, err := os.OpenFile(target, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0440) if err != nil { log.Println(err) return err } defer zipFile.Close() archive := zip.NewWriter(zipFile) defer archive.Close() return filepath.Walk(source, func(path string, info os.FileInfo, err error) error { if err != nil { return err } header, err := zip.FileInfoHeader(info) if err != nil { return err } if !info.IsDir() { header.Method = zip.Deflate } header.SetModTime(time.Now().UTC()) header.Name = path writer, err := archive.CreateHeader(header) if err != nil { return err } if info.IsDir() { return nil } file, err := os.Open(path) if err != nil { return err } defer file.Close() _, err = io.Copy(writer, file) return err }) }