答案:可通过Go程序实现日志按大小自动切割。程序每10秒检查文件大小,超过100MB则重命名归档并创建新文件,适用于中小型项目日志管理。

Linux系统中日志文件过大会影响性能和排查效率,因此需要定期切割。除了使用logrotate这类工具外,也可以通过编写Go程序实现自定义的日志切割逻辑。下面介绍一种基于Go语言实现日志文件按大小或时间自动切割的简单方案。
日志切割的核心是监控日志文件的大小或生成时间,当达到设定阈值时,将当前文件归档(如重命名加上时间戳),并创建新的空文件继续写入。常见策略包括:
以下是一个简单的Go程序示例,用于监控指定日志文件,当其大小超过限制时进行切割:
package main
<p>import (
"fmt"
"os"
"path/filepath"
"time"
)</p><p>const maxLogSize = 100 <em> 1024 </em> 1024 // 100MB
const logFilePath = "/var/log/myapp.log"</p><p>func rotateLog() error {
info, err := os.Stat(logFilePath)
if os.IsNotExist(err) {
return nil // 文件不存在,无需切割
}
if err != nil {
return fmt.Errorf("stat error: %v", err)
}</p><pre class='brush:php;toolbar:false;'>if info.Size() < maxLogSize {
return nil // 未超限,不切割
}
// 构造备份文件名:myapp.log.20250405-140203
backupName := fmt.Sprintf("%s.%s", logFilePath, time.Now().Format("20060102-150405"))
err = os.Rename(logFilePath, backupName)
if err != nil {
return fmt.Errorf("rename failed: %v", err)
}
// 创建新的空日志文件
_, err = os.Create(logFilePath)
if err != nil {
return fmt.Errorf("create new log file failed: %v", err)
}
fmt.Printf("Log rotated: %s -> %s\n", logFilePath, backupName)
return nil}
func main() { fmt.Println("Starting log rotation monitor...")
ticker := time.NewTicker(10 * time.Second) // 每10秒检查一次
defer ticker.Stop()
for {
select {
case <-ticker.C:
err := rotateLog()
if err != nil {
fmt.Fprintf(os.Stderr, "Rotation error: %v\n", err)
}
}
}}
将上述代码保存为log_rotate.go,然后执行:
go build log_rotate.go sudo ./log_rotate
建议以守护进程方式运行,或配合systemd服务管理。
实际使用中还需考虑以下几点:
基本上就这些。Go语言适合编写这种轻量级后台任务,灵活性高,易于集成进现有系统。对于大多数中小型项目,这种方式足够稳定可靠。
以上就是Linux日志怎么切割_Linux日志通过编写Go脚本实现日志切割的示例代码的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号