我想知道总体上是否有清除日志的正确方法?

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

侧面说明:我在设置Postfix时遇到了麻烦,并试图简化它阅读日志,希望它能对我有所帮助,而不必一直向下滚动。

评论

如果您只想看文件的结尾,那么tail是您的朋友。 tail /var/log/mail.log显示最后5行。 tail -f /var/log/mail.log查看写入文件末尾的所有行。

serverfault.com/questions/285843/…

#1 楼

您可以使用:

> /var/log/mail.log


这将截断日志,而无需编辑文件。这也是收回空间的可靠方法。有时人们会在日志上使用rm,然后重新创建文件名,这是一个错误,如果另一个进程打开了文件,那么直到该进程关闭它的句柄并且您会弄乱它的权限后,您才能获得空间。 />
此外,如果您正在查看日志的内容,则可能希望使用tail命令:

tail -f /var/log/mail.log


Ctrl-C可以消除拖尾。

评论


/ bin / csh(在FreeBSD中很常见)将使用“无效的null命令”来解决这个问题,而zsh(流行地替换bash)将等待EOF。参见serverfault.com/a/381380/67675

– poige
2012年4月20日在1:29

我该如何安排时间? crontab中的puting>语法未运行,因为它可能无法将其识别为语法

–ishandutta2007
19年3月6日在11:03

请注意,sudo“> /var/log/mail.log”将不起作用,请参见stackoverflow.com/a/82278/3025740

–Cédric Van Rompay
19年11月10日在12:48

#2 楼

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

轮换日志的方式取决于写日志的方式第一名。这是一个经常被忽视的问题。这里的一些答案至少涉及到它,提到某些日志记录程序会为日志文件保留一个打开的文件描述符,因此仅删除该文件不会释放空间,甚至不会将输出切换到新的日志文件。

例如,如果编写日志文件的程序是multilog软件包中的daemontools,则根本不做任何旋转日志的操作-没有手动脚本,没有cron作业。只需告诉multilog日志输出到一个目录,它本身就会在该目录中维护一组自动旋转且大小受限制的N个日志文件。

如果编写日志文件的程序是svlogd对于另一个示例,runit软件包同样适用。除了将工具指向目录之外,您什么也不需要做。它本身将在该目录中维护一组自动轮换且大小上限的N个日志文件。

如果使用rsyslog写入日志文件,则可以通知日志记录程序在日志记录后停止文件达到一定大小并运行脚本。您必须编写脚本的内容,才能根据总大小限制来实际重命名日志文件并删除旧的日志文件,但是至少日志记录程序已关闭该文件并暂停了日志的写操作。

日志记录程序(例如syslog-ng)仍然期望采用旧的syslogd循环日志方式,而logrotate在此处的另一个答案中提到的djangofan之类的工具仍在使用这种旋转日志的方式,有些偶然。一个运行一个cron作业,该作业会定期重命名日志文件,然后重新启动日志记录守护程序(使用运行它的任何守护程序管理程序)。当然,这样做的问题是,它没有强制执行总体大小上限。在较慢的几周中,每天可以获取N个非常小的日志文件,而在繁忙的日子中,则可以获取1个非常大的日志文件,这些文件的大小超出限制。

这就是为什么更高版本和更好的工具(例如multilogsvlogd)具有文件大小配置选项,并且当然可以实际检查日志文件大小的原因。世界已经了解到,使用cron作业甚至logrotate守护程序按计划轮询日志,会导致窗口大小错误,并在适当的位置进行这些检查,因此严格执行管理员定义的大小上限该程序的日志文件永远不会占用它们所在的分区,而实际上该程序实际上是在将这些文件写出的程序中。

评论


对于rsyslog,可以轻松配置它,使其依赖于由“模式”描述的文件名,例如,YEAR,MONTH和DAY。就像有一个模版(name =“ DYNmail” type =“ string” string =“ / var / log /%$ YEAR%/%$ MONTH%/%$ DAY%/ mail.log”)一样简单通过if($ syslogfacility-text =='mail')然后-?DYNmail; TraditionalFormat。这样,至少在每天可以单个文件的情况下,日志轮转仅仅是一个问题。对于大量日志(每天需要多次轮换),也有$ HOUR。

–Damiano Verzulli
15年7月1日在20:02

#3 楼

您也可以使用它。.

truncate /opt/package/logs/*.log --size 0


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

评论


我看不出有什么比以前的答案更好的了。

–卡巴斯德
2015年6月25日下午6:42

这实际上是一个很好的答案,并且实际上是唯一直接回答是否存在截断日志文件的正确方法的问题。与其他答案相比,如何更好地是没有删除日志文件,而是将内容正确地清零,因此在这种情况下,不会发生权限错误和缺少日志文件,这些日志文件会导致某些守护程序出现紧急情况。

– hmedia1
17年6月12日在2:51

#4 楼

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

评论


只是一个小小的修正:这不是服务,这是一个工具,通常从cron服务运行。

–rvs
2011年6月30日在16:38

#5 楼

如果清除日志的原因是要释放空间,则可以将/ 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


评论


以递归方式清除日志文件:对于$(find / var / log -type f)中的i;做cat / dev / null> $ i;完成

–马里(Iurie Malai)
17-2-20在7:50



#6 楼

简短而兼容的内容覆盖:
: > /dest/file

,但是在许多* NIX上也有truncate(2)系统调用和相应的用户空间工具truncate

#7 楼

如果要在清理文件之前保留文件,可以执行以下操作:

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log


如果要在日志中搜索特定的文本或电子邮件,可以使用grep。如果要保留一些有关邮件使用情况的图形,则可以使用AWStats。

#8 楼

这是我的操作方式,这仅适用于NGINX,您可以删除它以使其在所有日志文件上均可使用。

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "--------------- ⏲  Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "--------------- ⏲  Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "--------------- 💯 DONE: NGINX logs cleared ... ---------------"
}


#9 楼


cat / dev / null> / path / to / logfile


为我工作