概述
Postfix 支持其自己的日志记录系统,作为 syslog 的替代方案(syslog 仍为默认设置)。此功能自 Postfix 3.4 版本起可用。
本文档涵盖的主题:
配置文件日志记录 ;
文件日志记录解决了MacOS的可用性问题,并消除了基于systemd系统的多个问题。
如果 master.cf 中不存在以下行,请添加(注意:行首不能有空格):
postlog unix-dgram n - n - 1 postlogd
注意:服务类型 "unix-dgram" 在 Postfix 3.4 中引入。在回滚到较旧的 Postfix 版本之前,请删除上述行。
配置 Postfix 以将日志写入指定位置,例如 /var/log/postfix.log。请参阅下文的 "日志文件轮换" 部分以管理日志文件。
在下面的示例中,指定 maillog_file_permissions 是可选的(Postfix 3.9 及更高版本)。默认值为 0600,即仅超级用户可访问该文件;值 0644 还添加了"组"和"其他"读取权限。
# postfix stop # postconf maillog_file=/var/log/postfix.log # postconf maillog_file_permissions=0644 # (Postfix 3.9 及更高版本) # postfix start
默认情况下,日志文件名必须以 "/var" 或 "/dev/stdout" 开头(允许的前缀列表通过 maillog_file_prefixes 参数配置)。此安全机制可限制单个配置错误造成的损害。
配置将日志输出到标准输出 ;
将日志输出到标准输出在 Postfix 运行在容器中时非常有用,因为它消除了对 syslogd 的依赖。
如果 master.cf 中不存在以下行,请添加(注意:行首不能有空格):
postlog unix-dgram n - n - 1 postlogd
注意:服务类型 "unix-dgram" 是在 Postfix 3.4 中引入的。在回滚到较旧的 Postfix 版本之前,请删除上述行。
- 配置 main.cf 文件,将 "maillog_file" 设置为 "/dev/stdout"。
- 使用 "postfix start-fg" 启动 Postfix。
日志轮换 ;
命令 "postfix logrotate" 可手动执行或通过 cron 任务运行。它会记录所有错误,并在终端执行时将错误报告到 stderr。该命令实现以下步骤:
- 将当前日志文件重命名为包含日期和时间的后缀。该后缀通过 maillog_file_rotate_suffix 参数配置(默认:%Y%m%d-%H%M%S)。
- 重新加载 Postfix,以便 postlogd(8) 立即关闭旧日志文件。
- 短暂暂停后,压缩旧日志文件。压缩程序通过 maillog_file_compressor 参数配置(默认:gzip)。
- 下次记录事件时,postlogd(8) 将创建一个新日志文件,权限由 maillog_file_permissions 参数指定的权限(默认:0600)。
注意事项:
- 此命令不会旋转路径位于 /dev 目录下的日志文件,例如 /dev/stdout。
- 此命令目前不会删除旧日志文件。
限制
背景:
- Postfix 由多个在后台运行的守护进程以及用于本地邮件提交或 Postfix 管理的不守护进程组成。
- 将日志记录到 Postfix 日志文件或 stdout 需要 Postfix 的 postlogd(8) 服务。这确保了来自不同程序的并发日志记录不会混淆。
- 所有 Postfix 程序均可记录到 syslog,但并非所有程序都具备使用 Postfix 日志服务所需的权限,且许多非守护进程程序不得将日志记录到 stdout,否则会破坏其输出。
限制:
- 非守护进程的 Postfix 程序会在处理命令行选项和 main.cf 参数之前,将错误日志记录到 syslogd(8)。
- 如果 Postfix 服务不可用,非守护进程程序 postfix(1)、postsuper(1)、postmulti(1) 和 postlog(1) 将直接将日志记录到 $maillog_file。这些程序需要以 root 权限运行,例如在 Postfix 启动、重新加载或关闭时。
- 其他非守护进程的 Postfix 程序绝不会直接写入 $maillog_file(此外,将日志写入标准输出会干扰某些程序的运行)。这些程序可以在以超级用户身份运行时,或其可执行文件具有 set-gid 权限时,将日志记录到 postlogd(8)。请勿在其他程序上设置此权限,除非这些程序是 postdrop(1)、postqueue(1) 以及(Postfix ≥ 3.7)postlog(1) 之外的程序。