温馨提示×

Debian Golang日志清理方法有哪些

小樊
49
2025-08-29 14:48:36
栏目: 编程语言

1. 手动删除日志文件
适用于临时清理或少量日志文件的场景,通过命令行直接删除指定目录下的日志文件。例如,删除/var/log/myapp/目录下所有.log文件:

sudo rm -rf /var/log/myapp/*.log

若需按修改时间筛选(如删除30天前的日志),可使用find命令:

find /var/log/myapp -type f -name "*.log" -mtime +30 -exec rm {} \;

注意:手动操作需谨慎,避免误删正在使用的日志文件。

2. 使用logrotate工具(系统级自动管理)
Debian系统自带的日志轮转工具,可自动完成日志的轮转、压缩、删除,无需修改应用程序代码。步骤如下:

  • 安装logrotate(若未安装):
    sudo apt-get update && sudo apt-get install logrotate
    
  • 创建自定义配置文件(如/etc/logrotate.d/my-golang-app),添加以下内容(根据实际路径调整):
    /var/log/myapp/*.log {
        daily               # 每天轮转一次
        rotate 7            # 保留最近7个日志文件
        compress            # 压缩旧日志(如.gz格式)
        missingok           # 日志文件不存在时不报错
        notifempty          # 日志为空时不轮转
        create 0640 root adm # 新日志文件的权限和所有者
    }
    
  • 手动触发一次轮转(验证配置是否正确):
    sudo logrotate -f /etc/logrotate.d/my-golang-app
    

logrotate会自动根据配置定期执行(通常通过cron任务)。

3. 通过systemd日志管理(适用于systemd服务)
若Golang应用以systemd服务(如myapp.service)运行,可使用journalctl命令管理日志:

  • 查看服务最近100条日志:
    sudo journalctl -u myapp.service -n 100
    
  • 清理两周前的旧日志:
    sudo journalctl --vacuum-time=2weeks
    
  • 限制日志文件大小(如不超过100M):编辑/etc/systemd/journald.conf,修改SystemMaxUse=100M,然后重启服务:
    sudo systemctl restart systemd-journald
    

此方法无需额外工具,直接集成到systemd日志体系中。

4. 使用Golang第三方日志库的内置轮转功能
主流日志库(如logruszap)可通过第三方库(如lumberjack)实现日志自动轮转和清理,无需依赖系统工具。以logrus+lumberjack为例:

  • 安装lumberjack库:
    go get github.com/natefinch/lumberjack/v2
    
  • 在代码中配置lumberjack.Logger,设置轮转参数:
    package main
    import (
        "log"
        "github.com/sirupsen/logrus"
        "gopkg.in/natefinch/lumberjack.v2"
    )
    func main() {
        logger := &lumberjack.Logger{
            Filename:   "/var/log/myapp/myapp.log", // 日志文件路径
            MaxSize:    10,                         // 单个日志文件最大大小(MB)
            MaxBackups: 7,                          // 保留的最大日志文件数
            MaxAge:     30,                         // 保留的最大天数
            Compress:   true,                       // 压缩旧日志
        }
        logrus.SetOutput(logger) // 将logrus输出到lumberjack
        logrus.Info("Application started")
        // 应用程序逻辑...
    }
    

此方法将轮转逻辑集成到应用中,适用于需要更精细控制的场景。

5. 自定义日志清理脚本+定时任务
通过编写Shell脚本定期清理日志,适合需要自定义清理逻辑的场景。例如,创建cleanup_logs.sh脚本:

#!/bin/bash
LOG_DIR="/var/log/myapp"
MAX_LOGS=7
# 按修改时间排序,获取需要删除的文件列表
LOG_FILES=$(ls -t $LOG_DIR/*.log)
# 计算需删除的文件数量(保留最新的MAX_LOGS个)
NUM_TO_DELETE=$(( ${#LOG_FILES} - MAX_LOGS ))
# 删除多余的旧日志
if [ $NUM_TO_DELETE -gt 0 ]; then
    echo "Deleting old log files..."
    for ((i=0; i<NUM_TO_DELETE; i++)); do
        rm -f "${LOG_FILES[$i]}"
    done
fi
  • 赋予脚本执行权限:
    chmod +x cleanup_logs.sh
    
  • 添加定时任务(如每天凌晨1点运行):
    crontab -e
    
    在打开的编辑器中添加:
    0 1 * * * /path/to/cleanup_logs.sh
    

此方法灵活,可根据需求调整清理条件(如按大小、时间)。

0