删除并重新创建后,Postfix 不再登录到 /var/log/mail?

drp*_*eas 16 logs postfix files

我不小心删除了/var/log/mail文件。在那之前,我能够使用 postfix 的东西来监视它。现在,似乎 Postfix 不会将其日志发送到/var/log/mail,因为该文件没有使用新的日志消息进行更新。

Ash*_*ish 18

当您删除 mail.log 文件时,rsyslog(在 ubuntu 上)会丢失文件句柄。要让它在 Ubuntu 上重新运行,请提供:

sudo service rsyslog restart
Run Code Online (Sandbox Code Playgroud)

这不仅会创建新文件,还会开始写入日志。


drp*_*eas 6

即使在创建一个空文件之后

touch /var/log/mail
Run Code Online (Sandbox Code Playgroud)

你必须重新启动系统日志

service syslog restart
Run Code Online (Sandbox Code Playgroud)

然后是记录增益:)


小智 6

这不是 CentOS 7 上的问题。有人认为让 postfix 邮件日志通过日志记录器是个好主意。如果你想查看 postfix 日志:

journalctl -u postfix
Run Code Online (Sandbox Code Playgroud)

(查看整个日志)

journalctl -u postfix -f
Run Code Online (Sandbox Code Playgroud)

(拖尾日志)

您可能还需要在 main.cf 中添加 postfix

syslog_name = postfix
Run Code Online (Sandbox Code Playgroud)


小智 5

这是 syslog 中的一个错误,但说明了在程序打开文件时删除文件时的常见问题。当您执行“rm”时,您是在删除目录条目,但不是在删除底层文件。操作系统保留对文件的引用计数,并且在引用计数变为零之前不会实际删除基础文件数据。在平均文件的情况下,未打开文件的引用计数为 1(目录条目)。打开文件时,计数增加到 2。如果第二个程序打开同一个文件,计数将增加到 3。如果目录条目现在被删除,则计数减为 2——这意味着该文件是匿名的(没有名称),

当您删除 /var/log/mail 时,系统记录器仍然打开文件进行写入。如果您创建一个新的 /var/log/mail,它将指向一个与系统记录器当前正在写入的文件不同的文件。使一切保持一致的唯一方法是重新启动系统记录器。当原始系统记录器终止时,所有与其关联的文件都将关闭——包括您删除了其目录条目的匿名邮件日志。当您重新启动系统记录器时,它会在需要写入日志消息时重新打开 /var/log/mail,并在此后保持打开状态。

另一种经常发现的方式是当一个正在运行的程序用文件数据填满整个磁盘时;用户删除了非常大的文件,但是没有释放磁盘空间,因为该文件仍然存在,并且正在占用磁盘空间,但是目录项已被删除。当程序结束时(因为用户杀死了它或它自己结束了),磁盘空间将被恢复,因为文件的引用计数将变为零。

为了防止这种情况,记录器可能会做的是首先写日志消息,检查日志文件目录项是否存在,如果不存在,关闭原始日志文件,打开一个新的,然后重写消息——这样消息就不会丢失。但是要完成所有这些将需要比系统记录器应该具有的复杂得多 - 对于它写入的每条消息,由于额外的目录检查,写入的时间会更长 - 每次文件都会成功没有被删除。

为了更清楚地理解以上所有内容,以下命令很有启发性,因为它描述了执行目录条目删除和引用递减的系统调用:“man 3 unlink”