在 CentOS 系统下,使用 Golang 进行日志切割可以通过以下几种方法实现:
有许多第三方日志库提供了日志切割功能,例如 logrus、zap 等。这些库通常会提供日志切割、日志级别、日志格式等功能。你可以根据自己的需求选择合适的库。
以 logrus 为例,你可以使用 logrus 的 hooks 库来实现日志切割:
package main
import (
"github.com/sirupsen/logrus"
"github.com/lestrrat-go/file-rotatelogs"
"time"
)
func main() {
log := logrus.New()
// 设置日志级别
log.SetLevel(logrus.InfoLevel)
// 设置日志切割
log.SetReportCaller(true)
log.SetFormatter(&logrus.JSONFormatter{})
log.Out = rotatelogs.New(
"/var/log/myapp.log.%d{yyyy-MM-dd}.gz",
rotatelogs.WithLinkName("/var/log/myapp.log"),
rotatelogs.WithRotationTime(24*time.Hour),
)
log.Info("This is an info log")
}
你可以将 Golang 应用的日志输出到系统日志服务,例如 syslog 或 journald。这样,你可以使用系统自带的日志切割工具(例如 logrotate)来管理日志。
以 syslog 为例,你可以使用 go-syslog 库将日志输出到 syslog:
package main
import (
"github.com/RackSec/srs-lib-go/log"
)
func main() {
log.SetLogger("srs.log", log.LOG_INFO|log.LOG_NOTICE|log.LOG_ALERT|log.LOG_CRIT|log.LOG_ERR|log.LOG_WARNING|log.LOG_DEBUG, log.LOG_PID)
log.Info("This is an info log")
}
然后,你可以配置 logrotate 来实现日志切割:
/var/log/srs.log {
daily
missingok
rotate 7
compress
notifempty
create 640 root adm
}
如果你不想使用第三方库或系统日志服务,你可以在 Golang 应用中实现自定义的日志切割功能。例如,你可以定期检查日志文件的大小,并在达到指定大小时创建一个新的日志文件。
以下是一个简单的示例:
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"time"
)
const maxLogSize = 10 * 1024 * 1024 // 10 MB
func main() {
logFile, err := os.OpenFile("myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("Failed to open log file: %v", err)
}
defer logFile.Close()
logger := log.New(logFile, "", log.LstdFlags)
for {
info, err := logFile.Stat()
if err != nil {
log.Fatalf("Failed to get log file info: %v", err)
}
if info.Size() > maxLogSize {
logFile.Close()
for i := 9; i >= 1; i-- {
src := fmt.Sprintf("myapp.log.%d", i)
dst := fmt.Sprintf("myapp.log.%d.bak", i+1)
os.Rename(src, dst)
}
os.Rename("myapp.log", "myapp.log.1")
logFile, err = os.OpenFile("myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("Failed to open log file: %v", err)
}
}
logger.Println("This is an info log")
time.Sleep(1 * time.Second)
}
}
这个示例中,我们创建了一个名为 myapp.log 的日志文件,并定期检查其大小。当文件大小超过 10 MB 时,我们会将当前日志文件重命名为 myapp.log.1,并创建一个新的空日志文件。