1555 字
8 分钟
Linux日志清理手册
2025-07-03

本笔记记录了如何安全清理 Linux 系统中 /var/log 与宝塔面板日志目录 /www/wwwlogs 的方法,包括一键清理脚本、压缩日志删除、日志文件内容清空等操作,适用于释放磁盘空间、定期维护等场景。


可以清空内容的常见日志文件(不删除文件本身)#

以下文件可以用 > 文件名 清空(保留文件但清空内容):

Terminal window
sudo truncate -s 0 /var/log/syslog
sudo truncate -s 0 /var/log/auth.log
sudo truncate -s 0 /var/log/kern.log
sudo truncate -s 0 /var/log/dpkg.log
sudo truncate -s 0 /var/log/messages

或统一清空:

Terminal window
sudo find /var/log -type f -exec truncate -s 0 {} \;

不建议直接删除的内容#

  1. 日志目录结构和权限

    • 某些服务启动时会尝试写入特定日志文件,如 /var/log/nginx, /var/log/mysql 等。
    • 删除目录或日志文件后,服务可能因找不到文件或权限问题启动失败。
    • 某些目录中含有 .lock.pid 文件,也不宜删除。
  2. 日志轮替配置依赖文件结构

    • logrotate 和 systemd 的 journald 等组件会按预设规则轮替、压缩日志,删除文件可能破坏规则执行。
  3. journalctl 日志

    • 如果你使用 systemd(大多数现代 Debian 都用),大部分日志是以二进制形式存在于 /var/log/journal 中,这部分应使用专用命令清理:

      Terminal window
      sudo journalctl --vacuum-time=7d # 保留最近7天
      sudo journalctl --vacuum-size=500M # 保留最多500MB

✅ 推荐清理日志的正确方法#

1. 使用 logrotate#

Debian 默认已安装 logrotate,并且每日轮替日志。你可以手动触发它:

Terminal window
sudo logrotate -f /etc/logrotate.conf

2. 使用 journalctl 管理 systemd 日志#

Terminal window
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=500M

3. 自动清理脚本(温和方式)#

Terminal window
sudo find /var/log -type f -name "*.log" -exec truncate -s 0 {} \;
sudo journalctl --vacuum-time=7d

🧊 如果你真的要“强删”日志目录#

可以清空日志内容(truncate),或删除压缩历史日志(.gz, .1, .old,如:

Terminal window
sudo find /var/log -type f \( -name "*.gz" -o -name "*.1" -o -name "*.old" \) -delete

⚠️ 不要执行:

Terminal window
sudo rm -rf /var/log/*

这样可能破坏系统服务运行。


✅ 安全清理(推荐)#

✅ 1. 压缩日志 .gz, .1, .2.gz 等是最可删的#

这些是旧日志轮替后的备份版本,可以直接删:

Terminal window
sudo find /var/log -type f -name "*.gz" -delete
sudo find /var/log -type f -regex ".*\.[1-9]" -delete

这会删除:

  • auth.log.2.gz
  • kern.log.3.gz
  • syslog.1
  • mail.warn.3.gz
  • 等等

不会影响系统运行,只是删除历史记录。


✅ 2. 清空当前日志内容(不删文件)#

可以清空内容但不删文件,防止服务出错:

Terminal window
sudo find /var/log -type f -exec truncate -s 0 {} \;

这适合临时精简镜像、释放空间,但不建议频繁做,长期建议用 logrotate 管理。


⚠️ 慎删或保留的文件#

文件/目录说明
btmp, wtmp, lastlog记录登录信息,某些命令如 lastwho 依赖它们,不建议删除
cloud-init.log, cloud-init-output.log云主机初始化日志,仅首次使用时有用,可以清空或删除
/var/log/private有些系统服务的私有日志,勿删目录,可清空内部内容
/var/log/apt/APT 包管理日志,清理 .gz 可,但最好保留当前 history.log

✅ 一条命令清理常见日志(安全 + 实用)#

Terminal window
sudo journalctl --vacuum-time=7d
sudo find /var/log -type f \( -name "*.gz" -o -regex ".*\.[1-9]" \) -delete
sudo find /var/log -type f -exec truncate -s 0 {} \;

🚫 切勿执行#

Terminal window
sudo rm -rf /var/log/*

这样会导致系统服务丢失日志文件位置,影响服务启动和安全监控。


/www/wwwlogs宝塔面板(BT 面板) 默认的网站访问日志与错误日志目录。它通常包含 Nginx 或 Apache 的日志文件,例如:

Terminal window
/www/wwwlogs/
├── example.com.access.log
├── example.com.error.log
├── another-site.com.access.log
└── ...

这些日志不是系统必须的可以安全删除或清空,特别是如果你不需要做日志分析或排错。


✅ 常见清理方式#

✅ 1. 删除所有日志文件(释放空间最大化)#

Terminal window
sudo rm -f /www/wwwlogs/*.log

或删除 .log.log.[数字](例如轮替日志):

Terminal window
sudo find /www/wwwlogs -type f \( -name "*.log" -o -regex ".*\.log\.[0-9]+" \) -delete

✅ 2. 只清空当前日志内容(保留文件,避免 Nginx/Apache 报错)#

Terminal window
sudo find /www/wwwlogs -type f -name "*.log" -exec truncate -s 0 {} \;

Nginx/Apache 如果日志文件正在写入,直接删除文件后不重启服务会导致日志内容继续写入“丢失的 inode”,所以更推荐使用 truncate


🔁 可选:定期自动清理日志(加到 crontab)#

你可以添加定期清理任务,比如每晚清空日志:

Terminal window
sudo crontab -e

加入以下行(每日凌晨 1 点清空):

Terminal window
0 1 * * * find /www/wwwlogs -type f -name "*.log" -exec truncate -s 0 {} \;

🚫 注意事项#

  • 不要删除 /www/wwwlogs 目录本身,否则宝塔/Nginx 会无法写入日志导致报错。
  • 如果你正在排查网站问题,保留日志会有帮助。

以下是一个安全又高效的 Bash 脚本,它会:#

✅ 作用总结:#

  • 清空 /www/wwwlogs/var/log 目录下所有日志内容(保留文件)
  • 删除 .gz.1.2.gz 等历史轮替压缩日志(节省空间)
  • 不会删除任何日志目录或当前正在写入的 .log 文件本身

🧾 脚本内容(建议保存为 clean_logs.sh):#

#!/bin/bash
echo "🔧 清理开始..."
# 1. 删除压缩和历史轮替日志(*.gz 和 .1, .2.gz 等)
echo "🧹 删除压缩和历史日志..."
find /var/log /www/wwwlogs -type f \( -name "*.gz" -o -regex ".*\.[1-9](\.gz)?$" \) -exec rm -f {} \;
# 2. 清空所有 .log 和其他日志内容(保留文件)
echo "📄 清空日志内容..."
find /var/log /www/wwwlogs -type f -exec truncate -s 0 {} \;
echo "✅ 清理完成。"

📌 使用方法:#

  1. 保存脚本文件:
Terminal window
nano clean_logs.sh

然后粘贴上面的内容,保存退出(Ctrl+O, Enter, Ctrl+X

  1. 赋予执行权限:
Terminal window
chmod +x clean_logs.sh
  1. 运行脚本:
Terminal window
sudo ./clean_logs.sh

如果运行命令有错误,大概率应该是经典的 Windows 换行符问题

✅ 解决方法:把 Windows 换行转换成 Linux 换行#

如果你是用 Windows 编辑器(如 Notepad++、VS Code、记事本)创建了 clean_logs.sh,它在每一行结尾使用了 CRLF^M),而 Linux 需要的是 LF。在Liunx文件目录运行:

sed -i 's/\r$//' clean_logs.sh

🛡️ 安全说明:#

  • 使用 truncate -s 0 会保留文件和权限,避免影响服务运行。
  • 删除的是 .gz.1, .2.gz 这类轮替压缩日志,绝对不会删除你系统当前写入的日志主文件。
  • 不会清理 btmpwtmplastlog 等系统记录文件。

Linux日志清理手册
https://blog.wlens.top/posts/linux-日志清理手册/
作者
Lao Wang
发布于
2025-07-03
许可协议
CC BY-NC-SA 4.0