发布于2026-06-30 阅读(0)
扫一扫,手机访问
在Debian环境下打理Golang应用日志,其实没那么复杂。系统本身就提供了一些顺手工具,自己写代码也能搞定。下面两种方法,都是实际项目中常用的,可以根据场景灵活选。

logrotate 是 Debian 标配的日志管理利器,配置好就能自动轮转和清理,省心省力。你只需要给应用创建一个配置文件,放到 /etc/logrotate.d/ 目录下就行。比如建一个名叫 myapp 的文件,内容大致如下:
/path/to/your/golang/app/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root adm
}
这些参数的意思是:每天轮转一次,保留最近7天的日志,旧日志自动压缩;如果日志文件不存在也不会报错;空文件不轮转;轮转后新日志文件的权限和所有者按指定设置。配置好之后,logrotate 会按计划自动跑起来,旧日志定期被清掉,完全不用操心。
如果想让清理逻辑跟应用本身绑定得更紧,或者需要更灵活的控制,直接在 Go 代码里实现也是好路子。借助 os 包和 time 包就能搞定。下面是一个简单的示例:
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
"time"
)
func main() {
logFile := "/path/to/your/golang/app/logs/myapp.log"
// 创建日志文件
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening log file: %v", err)
}
defer file.Close()
logger := log.New(file, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)
// 每天清理旧的日志文件
go func() {
for {
time.Sleep(24 * time.Hour)
cleanupOldLogs(logFile)
}
}()
// 写入日志
logger.Println("This is a test log entry.")
}
func cleanupOldLogs(logFile string) {
now := time.Now()
filePath := filepath.Dir(logFile)
files, err := ioutil.ReadDir(filePath)
if err != nil {
log.Printf("error reading log directory: %v", err)
return
}
for _, file := range files {
fileInfo, err := file.Info()
if err != nil {
log.Printf("error getting file info: %v", err)
continue
}
if fileInfo.IsDir() {
continue
}
fileTime := fileInfo.ModTime()
if now.Sub(fileTime) > 7*24*time.Hour {
os.Remove(filepath.Join(filePath, file.Name()))
}
}
}
这个例子里起了一个后台 goroutine,每天定时检查日志目录,凡是最后修改时间超过7天的文件都会被删掉。你可以根据实际需求调整保留天数,或者改成按文件大小来清理。两种方法各有优势:logrotate 适合传统运维场景,而代码内清理则让应用有了更强的自治能力。按需选用就好。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8