有没有正确的方法来清除日志?

mas*_*act 80 linux ubuntu logging

我想知道是否有适当的方法来清除一般的日志?

我是 Ubuntu 的新手,我正在尝试设置 Postfix。有问题的登录是/var/log/mail.log。我想知道是否有正确的方法来清除它,而不是我进入它并删除所有行并保存它。我发现有时在我清除日志并保存后不会立即写入错误。

旁注:我在设置 Postfix 时遇到问题,我试图让我更轻松地阅读日志,希望它可以帮助我,而不必一直向下滚动。

dav*_*vey 91

您可以使用:

> /var/log/mail.log
Run Code Online (Sandbox Code Playgroud)

这将截断日志,而无需编辑文件。这也是恢复空间的可靠方法。有时人们会错误地在日志上使用 rm 然后重新创建文件名,如果另一个进程打开了该文件,那么在该进程关闭它的句柄之前,您不会收回空间,并且您可能会弄乱它的权限。

此外,如果您正在查看日志的内容,您可能想使用以下tail命令:

tail -f /var/log/mail.log
Run Code Online (Sandbox Code Playgroud)

Ctrl-C 将断开拖尾。

  • `/bin/csh`(在 FreeBSD 中很常见)会用“无效的空命令”来解决这个问题,同时 `zsh`(`bash` 的流行替代品)会等待 EOF。见 http://serverfault.com/a/381380/67675 (2认同)

小智 31

你也可以用这个..

truncate /opt/package/logs/*.log --size 0
Run Code Online (Sandbox Code Playgroud)

这里 /opt/package/logs 中的所有日志文件都将变为空..

  • 这实际上是一个非常好的答案,并且确实是唯一一个直接回答是否有截断日志文件的正确方法的问题的答案。它比其他答案更好的是它不删除日志文件,它正确地将内容归零,因此在这种情况下不会发生权限错误和丢失日志文件导致某些守护进程恐慌。 (11认同)

Jde*_*eBP 30

是的,有一个正确的方法:您根本不清除日志。你旋转它们。轮换涉及将日志输出切换到同名的新文件,前 N 个日志文件保存在一组 N 个相关文件名下。

如何旋转日志取决于人们如何编写它们。 这是一个经常被忽视的点。这里的一些答案至少涉及它,提到一些日志程序为日志文件保留了一个打开的文件描述符,因此仅删除文件不会释放空间,甚至甚至将输出切换到新的日志文件。

例如,如果写入日志文件的程序multilog来自daemontools,那么您根本不需要做任何事情来轮换日志——没有手动脚本,没有cron作业。简单地告诉multilog日志输出到一个目录,它本身将在该目录中维护一个自动轮换和大小限制的 N 个日志文件集。

如果写入日志文件的程序svlogd来自runitpackage,例如另一个例子,那么同样适用。除了将工具指向目录之外,您什么都不做。它本身将在该目录中维护一组自动轮换和大小限制的 N 个日志文件。

如果您使用rsyslog写入日志文件,则可以告诉日志程序在日志文件达到一定大小后停止并运行脚本。您必须编写脚本的主要内容,根据总大小限制实际重命名日志文件并删除旧日志文件,但至少日志程序已关闭文件并在发生这种情况时暂停日志写入。

syslogd日志记录程序(例如 syslog-ng以及此处的另一个答案中logrotate提到的工具所举例说明的)仍然希望使用旧的日志轮换方式,但这种方式djangofan更加随意。运行一项cron定期重命名日志文件的作业,并重新启动日志守护程序(使用它正在运行的任何守护程序主管)。当然,这样做的问题是它没有强制执行整体尺寸上限。在缓慢的几周内,您可以获得 N 个非常小的每日日志文件,而在繁忙的日子里,您可以获得 1 个远远超过大小限制的非常大的日志文件。

这就是为什么后来更好的工具喜欢multilogsvlogd具有文件大小配置选项并实际检查日志文件大小的原因,当然。全世界都知道,按计划使用cron作业或什至logrotate守护程序轮询日志,会导致窗口大小错误,并且是进行这些检查的正确位置,因此严格执行管理员定义的大小上限,以便日志文件永远不会吞下它们所在的分区,而是在首先实际将文件写出的程序中。


dja*_*fan 11

是的,有一个名为LogRotate 的Linux 工具。

  • 只是一个小小的更正:这不是服务,这是一个工具,通常从 cron 服务运行。 (9认同)

小智 10

如果您清除日志的原因是为了释放空间,您可以将 /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
Run Code Online (Sandbox Code Playgroud)

  • 递归清除日志文件:`for i in $(find /var/log -type f); 做 cat /dev/null > $i; 完成` (3认同)