我想知道是否有一种正确的方法来清除日志?
我是 Ubuntu 新手,正在尝试设置 Postfix。登录问题是/var/log/mail.log
。我想知道是否有正确的方法来清除它,而不是我进入它并删除所有行并保存它。我发现有时在我清除日志并保存后错误不会立即写入其中。
旁注:我在设置 Postfix 时遇到了麻烦,我正在尝试让我更容易地阅读日志,希望它可以帮助我,而不必一直向下滚动。
答案1
您可以使用:
> /var/log/mail.log
这将截断日志,而您无需编辑文件。这也是恢复空间的可靠方法。
一般来说,在日志上使用然后重新创建文件名是一件坏事rm
,如果另一个进程打开了该文件,那么在该进程关闭其句柄之前,您无法取回空间,并且您可能会以不明显的方式损坏它的权限,但会在以后引起更多问题。
Yasar 有一个很好的答案,使用truncate
此外,如果您正在查看日志内容,您可能想使用以下tail
命令:
tail -f /var/log/mail.log
Ctrl-C 将中断尾随。
答案2
你也可以使用这个..
truncate /opt/package/logs/*.log --size 0
这里 /opt/package/logs 中的所有日志文件都将变空。
答案3
是的,有一个正确的方法:你不需要清除日志。您旋转轮换包括将日志输出切换到同名的新文件,而之前的 N 个日志文件则保存在一组 N 个相关文件名下。
如何轮换日志取决于最初的写入方式。 这是经常被忽视的一点。这里的一些答案至少涉及了这一点,并提到一些日志程序会为日志文件保留一个打开的文件描述符,因此仅删除该文件不会释放空间,甚至不会将输出切换到新的日志文件。
如果写入日志文件的程序是multilog
从daemontools
包中例如,那么您根本不需要执行任何操作来轮换日志 — 没有手动脚本,没有cron
作业。只需告诉multilog
日志输出到目录,它本身就会在该目录中维护一组自动轮换且大小受限的 N 个日志文件。
如果写入日志文件的程序是svlogd
从runit
包中,再举一个例子,那么情况也大致相同。除了将工具指向目录之外,您无需执行任何操作。它本身将在该目录中维护一组自动轮换且大小受限的 N 个日志文件。
如果您正在使用rsyslog
写入日志文件,那么可以指示日志记录程序在日志文件达到一定大小后停止并运行脚本。您必须编写脚本的主要内容,根据总大小限制实际重命名日志文件并删除旧日志文件,但至少日志程序已关闭文件并在发生这种情况时暂停日志写入。
syslogd
旋转原木的老方法,仍受 syslog-ng 等日志程序的期望并且正如此处另一个答案中logrotate
提到的工具所示例的那样djangofan
,它有点随意。运行一个cron
作业,定期重命名日志文件,并重新启动日志守护程序(使用它正在运行的任何守护程序管理器)。当然,这样做的问题是它不强制执行总体大小上限。在空闲的几周里,人们可以得到 N 个非常小的每日日志文件,而在繁忙的日子里,人们可以得到 1 个非常大的日志文件,远远超出大小限制。
这就是为什么后来更好的工具喜欢multilog
并svlogd
具有文件大小配置选项,并且实际上会检查日志文件大小的原因。世界已经了解到,使用cron
作业或守护进程按计划轮询logrotate
日志,会留下大小错误的机会,并且进行这些检查的正确位置,因此严格地强制执行管理员定义的大小上限,以便日志文件永远不会吞噬它们所在的分区,这是在实际上首先将文件写出的程序中。
答案4
如果清除日志是为了释放空间,您可以 cat /dev/null 到它们,而不会中断写入它的程序。永远不要删除它们!某些软件可能会通过停止工作或完全忽略日志直到下次重新启动来抱怨
cat /dev/null > /path/to/logfile
# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done