go语言切割 golang 字符串切割

使用golang 还有必要使用 nginx 么简单学习了golang/go语言的基础语法,做个定时切割nginx日志的小脚本练习下,感觉挺好使的~
脚本代码如下 , install后将脚本加入到crontab定时运行,当然golang也可以自己定时执行,这里加入到crontab运行,是因为golang进程有可能会被kill掉....
package main
import (
"fmt"
"os"
"path/filepath"
"syscall"
"time"
"strings"
"os/exec"
"io/ioutil"
)
func main(){
//日志目录
srcDirPath := "/usr/local/nginx/logs"
//存放切割日志目录
targetDirPath := "/usr/local/nginx/logs/history"
//ngixn进程ID文件
【go语言切割 golang 字符串切割】 nginxPidPath := "/usr/local/nginx/logs/nginx.pid"
//检查存放切割日志目录是否存在,如果不存在则创建
finfo, errFile := os.Stat(targetDirPath)
if errFile !=nil {
errFile := os.MkdirAll(targetDirPath, 0777)
if errFile != nil {
fmt.Println("创建日志目录失败:"+errFile.Error())
return
}
} else if !finfo.IsDir() {
fmt.Println(targetDirPath+"已经存在且不是一个目录")
return
}
//获取当前日期,作为此次切割日志根目录
t := time.Now()
nowDateTime := t.Format("2006-01-02")
logPath := targetDirPath+"/"+nowDateTime
os.MkdirAll(logPath, 0777)
//获取nginx的进程ID
pfile,err := os.Open(nginxPidPath)
defer pfile.Close()
if err != nil {
fmt.Println("not found nginx pid file")
return
}
pidData,_ := ioutil.ReadAll(pfile)
pid := string(pidData)
pid = strings.Replace(pid,"\n","",-1)
//遍历日志目录
filepath.Walk(srcDirPath,func(path string, info os.FileInfo, err error) error {
if info.IsDir() {
return nil
} else {
//获取切割日志路径
targetfilePath := strings.Replace(path,srcDirPath,logPath,1)
if strings.Index(targetfilePath,"nginx.pid") != -1 {
return nil
}
//移动文件
syscall.Rename(path,targetfilePath)
//创建原文件,这里不需要了,因为重启nginx后会自动生成滴
// nFile,errCreate := os.Create(path)
// if errCreate != nil {
//fmt.Println("create file faild:"+errCreate.Error())
// }
// defer nFile.Close()
}
return nil
})
//平滑重启nginx
cmd := exec.Command("kill","-USR1",pid)
_, errCmd := cmd.Output()
if errCmd != nil {
fmt.Println("重启nginx失败:"+errCmd.Error())
return;
}
fmt.Println("success")
(十一)golang 内存分析编写过C语言程序的肯定知道通过malloc()方法动态申请内存,其中内存分配器使用的是glibc提供的ptmalloc2 。除了glibc,业界比较出名的内存分配器有Google的tcmalloc和Facebook的jemalloc 。二者在避免内存碎片和性能上均比glic有比较大的优势,在多线程环境中效果更明显 。
Golang中也实现了内存分配器,原理与tcmalloc类似,简单的说就是维护一块大的全局内存,每个线程(Golang中为P)维护一块小的私有内存,私有内存不足再从全局申请 。另外,内存分配与GC(垃圾回收)关系密切,所以了解GC前有必要了解内存分配的原理 。
为了方便自主管理内存,做法便是先向系统申请一块内存,然后将内存切割成小块,通过一定的内存分配算法管理内存 。以64位系统为例,Golang程序启动时会向系统申请的内存如下图所示:
预申请的内存划分为spans、bitmap、arena三部分 。其中arena即为所谓的堆区,应用中需要的内存从这里分配 。其中spans和bitmap是为了管理arena区而存在的 。
arena的大小为512G , 为了方便管理把arena区域划分成一个个的page,每个page为8KB,一共有512GB/8KB个页;

推荐阅读