日志的转储和压缩是非常关键的,它不仅可以减少硬盘空间占用,主要还可以在发生故障时根据日志定位出故障原因。下面来看看golang和java的文件转储实现。
go语言:
用到了filepath包下的Walk方法,具体说明可以参看历史文章:
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
})
}